我正在尝试使用RPC方法将包含元数据的文档上传到sharepoint
好吧它除了某些类型的文件,如docx,xlsx ..工作正常
我没有收到任何错误或异常,它们(docx,xlsx。)正确上传到sharepoint但没有相关的元数据。
如何解决此问题?
以下是我用于上传元数据的代码:
private static bool Upload(string webUrl, string documentName, byte[] bytes, Dictionary<string, object> metaInfo, NetworkCredential netAccess, out string result)
{
string putOption = "overwrite,createdir,migrationsemantics"; // see http://msdn2.microsoft.com/en-us/library/ms455325.aspx
string comment = null;
bool keepCheckedOut = false;
string method = "method=put+document%3a12.0.4518.1016&service_name=%2f&document=[document_name={0};meta_info=[{1}]]&put_option={2}&comment={3}&keep_checked_out={4}\n";
method = String.Format(method, documentName, EncodeMetaInfo(metaInfo), putOption, HttpUtility.UrlEncode(comment), keepCheckedOut.ToString().ToLower());
List<byte> data = new List<byte>();
data.AddRange(Encoding.UTF8.GetBytes(method));
data.AddRange(bytes);
try
{
using (WebClient webClient = new WebClient())
{
webClient.Credentials = netAccess;
webClient.Headers.Add("Content-Type", "application/x-vermeer-urlencoded");
webClient.Headers.Add("X-Vermeer-Content-Type", "application/x-vermeer-urlencoded");
result = Encoding.UTF8.GetString(webClient.UploadData(webUrl + "/_vti_bin/_vti_aut/author.dll", "POST", data.ToArray()));
if (result.IndexOf("\n<p>message=successfully") < 0)
throw new Exception(result);
}
}
catch (Exception ex)
{
result = ex.Message;
return false;
}
return true;
}
答案 0 :(得分:3)
这是旧的,但由于SharePoint中的属性提升,因此未为office文件设置元数据。 如果您创建自己的Web服务,则可以在添加文档时禁用此服务。 要使用FrontPage rpc,只需在第一次'PUT'-mthode调用后再次设置元数据,您将获得另一个版本,但第二次应用元数据。
答案 1 :(得分:0)
我不确定您的代码究竟是什么问题,但有一些类似的代码可以通过this blog上的RPC调用将文件上传到Sharepoint 2007,您可以尝试使用。
答案 2 :(得分:0)
加比, 我对docx和xlsx文件有类似的行为。
上传文档后,如果文件类型为docx或xlsx,我会调用sp webservice来更新元数据。
这是文件上传成功后的代码:
int extlength = 0;
extlength = documentName.Length - documentName.LastIndexOf(".") - 1;
string docext = documentName.Substring(documentName.LastIndexOf(".") + 1, extlength);
if (docext == "xlsx" || docext == "docx")
{
string doclookupname = metaInfo["PermitApplicationID"].ToString() + "_" + metaInfo["Title"].ToString();
UpdateMetaData("Shared Documents", "1", doclookupname, "PermitApplicationID", metaInfo["PermitApplicationID"].ToString());
UpdateMetaData("Shared Documents", "1", doclookupname, "DocumentCategories", metaInfo["DocumentCategories"].ToString());
UpdateMetaData("Shared Documents", "1", doclookupname, "Title", metaInfo["Title"].ToString());
}
这是上面的代码调用以使用sp列表服务更新元数据的函数。我为每个要更新的元数据值调用此函数。
private static void UpdateMetaData(string strListName, string rowLimit, string strDocTitle, string FieldName, string NewValue)
{
Lists_WinAuth.Lists li = new Lists_WinAuth.Lists();
li.Credentials = new NetworkCredential("yourUserID", "YourPwd", "YourDomain");
XmlDocument xmlDoc = new System.Xml.XmlDocument();
/////////get id
XmlNode ndQuery = xmlDoc.CreateNode(XmlNodeType.Element, "Query", "");
XmlNode ndViewFields = xmlDoc.CreateNode(XmlNodeType.Element, "ViewFields", "");
XmlNode ndQueryOptions = xmlDoc.CreateNode(XmlNodeType.Element, "QueryOptions", "");
ndQueryOptions.InnerXml = "<IncludeMandatoryColumns>FALSE</IncludeMandatoryColumns>" +
"<DateInUtc>TRUE</DateInUtc>";
ndViewFields.InnerXml = "<FieldRef Name='ID' /> ";
ndQuery.InnerXml = "<Where>" +
"<Eq>" +
"<FieldRef Name='FileLeafRef' />" +
"<Value Type='Text'>" + strDocTitle + "</Value>" +
"</Eq>" +
"</Where>";
XmlNode ndListItems = li.GetListItems(strListName, "", ndQuery, ndViewFields, rowLimit, ndQueryOptions, null);
string strDocID = ndListItems.ChildNodes[1].ChildNodes[1].Attributes[0].Value.ToString();
//////////update
string strBatch = "<Method ID='1' Cmd='Update'>" +
"<Field Name='ID'>" + strDocID + "</Field>" +
"<Field Name='" + FieldName + "'>" + NewValue + "</Field></Method>";
System.Xml.XmlElement elBatch = xmlDoc.CreateElement("Batch");
elBatch.SetAttribute("OnError", "Continue");
elBatch.InnerXml = strBatch;
try
{
XmlNode ndReturn = li.UpdateListItems("Shared Documents", elBatch);
}
catch (Exception ex)
{
throw;
}
return;
}