Загрузить на Sharepoint с помощью FrontPage RPC - PullRequest
4 голосов
/ 04 марта 2010

Я пытаюсь загрузить документы с их метаданными в sharepoint, используя метод RPC.
хорошо, он работает нормально, за исключением некоторых типов файлов, таких как 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;
    }

Ответы [ 3 ]

3 голосов
/ 29 ноября 2012

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

0 голосов
/ 18 мая 2012

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());

                    }

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

        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;
        }
0 голосов
/ 19 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...