使用FrontPage RPC上传到Sharepoint

时间:2010-03-04 07:52:13

标签: c# sharepoint-2007 moss rpc file-upload

我正在尝试使用RPC方法将包含元数据的文档上传到sharepoint 好吧它除了某些类型的文件,如docx,xl​​sx ..工作正常 我没有收到任何错误或异常,它们(docx,xl​​sx。)正确上传到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 个答案:

答案 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;
        }