2010-03-04 3 views
4

Я пытаюсь загрузить документы с их метаданными в sharepoint с помощью метода RPC.
хорошо работает, за исключением некоторых типов файлов, таких как docx, xlsx ..
У меня нет ошибок или исключений, они (docx, xlsx.) Загружены в sharepoint правильно, но без связанных метаданных.

Как я могу исправить эту проблему?Загрузить в Sharepoint с помощью FrontPage RPC

Ниже приведен код, я использую, чтобы загрузить с метаданными:

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

Я не уверен, что точная проблема с вашим кодом, но есть похожий код, который загружает файлы в Sharepoint 2007 с помощью RPC вызывает this blog, который вы можете попробовать.

0

Gaby, У меня такое же поведение для файлов 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()); 

        } 

Это функция, что приведенный выше код вызывает обновление метаданных, используя службу списков зр. Я вызываю эту функцию для каждого значения метаданных, которое я хочу обновить.

 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; 
     } 
3

Это старый, но метаданные не установлены для офисных файлов из-за продвижения собственности в SharePoint. Если вы создаете собственный веб-сервис, вы можете отключить его, когда вы добавите документ. Чтобы использовать FrontPage rpc, просто установите метаданные снова после первого вызова «PUT»-mthode, вы получите другую версию, но во втором случае применяются метаданные.