【问题标题】:How to upload document with metadata to SharePoint doc. library using Client Object Model?如何将带有元数据的文档上传到 SharePoint 文档。使用客户端对象模型的库?
【发布时间】:2019-12-20 17:15:22
【问题描述】:

我正在开发 VSTO Outlook 加载项,因此我使用的是 SharePoint 客户端对象模型。我可以将文档上传到 SharePoint doc。库并通过一项操作添加元数据?使用谷歌我发现了很多上传后添加元数据的示例。我还发现可以使用完整的 API(File.Add() 方法和哈希表)添加元数据。

帮助?

【问题讨论】:

    标签: sharepoint object model client


    【解决方案1】:

    你可以使用这样的代码:

    ClientContext context = new ClientContext("SITEURL");
    Site site = context.Site;
    Web web = context.Web;
    context.Load(site);
    context.Load(web);
    context.ExecuteQuery();
    
    List list = listCollection.GetByTitle("Reports");
    context.Load(list);
    context.ExecuteQuery();
    
    context.Load(list.RootFolder);
    context.Load(list.RootFolder.Folders);
    context.ExecuteQuery();
    
    foreach (Folder folder in list.RootFolder.Folders)
    {
        if (folder.Name == "Folder-To-Upload")
        {
            FileCreationInformation fci = new FileCreationInformation();
    
            byte[] array = System.IO.File.ReadAllBytes("SlmReportPeriods.xml"); // File which you want to upload
    
            fci.Content = array;
            fci.Overwrite = true;
            fci.Url = "Sample";
            File file = folder.Files.Add(fci);
    
    
            ListItem item = file.ListItemAllFields;
            item["Field1"] = "Example1";
            item["Field2"] = "ETC.";
            item.Update();
    
            folder.Files.Add(fci);
            context.ExecuteQuery();
        }
    }
    

    本示例的本质是利用FileCreationInformation和File对象,获取item的ListItemAllFields。

    【讨论】:

      【解决方案2】:

      Redzio 的回答对我有用。

      以下代码来自博客文章Upload Large Files to SharePoint Online(作者 Piyush K Singh):

      public File UploadLargeFileWithMetadata(ClientContext ctx, List docs, string fileName) {
          int blockSize = 8000000; // 8 MB
          string uniqueFileName = String.Empty;
          long fileSize;
          Microsoft.SharePoint.Client.File uploadFile = null;
          Guid uploadId = Guid.NewGuid();
      
          ctx.Load(docs.RootFolder, p = >p.ServerRelativeUrl);
      
          // Use large file upload approach
          ClientResult < long > bytesUploaded = null;
      
          FileStream fs = null;
          try {
              fs = System.IO.File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
      
              fileSize = fs.Length;
              uniqueFileName = System.IO.Path.GetFileName(fs.Name);
      
              using(BinaryReader br = new BinaryReader(fs)) {
                  byte[] buffer = new byte[blockSize];
                  byte[] lastBuffer = null;
                  long fileoffset = 0;
                  long totalBytesRead = 0;
                  int bytesRead;
                  bool first = true;
                  bool last = false;
      
                  // Read data from filesystem in blocks
                  while ((bytesRead = br.Read(buffer, 0, buffer.Length)) > 0) {
                      totalBytesRead = totalBytesRead + bytesRead;
      
                      // We've reached the end of the file
                      if (totalBytesRead <= fileSize) {
                          last = true;
                          // Copy to a new buffer that has the correct size
                          lastBuffer = new byte[bytesRead];
                          Array.Copy(buffer, 0, lastBuffer, 0, bytesRead);
                      }
      
                      if (first) {
                          using(MemoryStream contentStream = new MemoryStream()) {
                              // Add an empty file.
                              FileCreationInformation fileInfo = new FileCreationInformation();
                              fileInfo.ContentStream = contentStream;
                              fileInfo.Url = uniqueFileName;
                              fileInfo.Overwrite = true;
                              uploadFile = docs.RootFolder.Files.Add(fileInfo);
      
                              // Start upload by uploading the first slice.
                              using(MemoryStream s = new MemoryStream(buffer)) {
                                  // Call the start upload method on the first slice
                                  bytesUploaded = uploadFile.StartUpload(uploadId, s);
                                  ctx.ExecuteQuery();
                                  // fileoffset is the pointer where the next slice will be added
                                  fileoffset = bytesUploaded.Value;
                              }
                              ListItem Subs = uploadFile.ListItemAllFields;
                              Subs["Title"] = Convert.ToString(CompanyName.Value);
                              Subs["Address"] = Convert.ToString(Address.Value);
                              Subs["City"] = Convert.ToString(City.Value);
                              Subs["State"] = Convert.ToString(State.Value);
                              Subs["Zip"] = Convert.ToString(Zip.Value);
                              Subs["Country"] = Convert.ToString(Country.Value);
                              Subs["Website"] = Convert.ToString(WebSite.Value);
                              Subs.Update();
                              // we can only start the upload once
                              first = false;
                          }
                      }
                      else {
                          // Get a reference to our file
                          uploadFile = ctx.Web.GetFileByServerRelativeUrl(docs.RootFolder.ServerRelativeUrl + System.IO.Path.AltDirectorySeparatorChar + uniqueFileName);
      
                          if (last) {
                              // Is this the last slice of data?
                              using(MemoryStream s = new MemoryStream(lastBuffer)) {
                                  // End sliced upload by calling FinishUpload
                                  uploadFile = uploadFile.FinishUpload(uploadId, fileoffset, s);
                                  ctx.ExecuteQuery();
      
                                  // return the file object for the uploaded file
                                  return uploadFile;
                              }
                          }
                          else {
                              using(MemoryStream s = new MemoryStream(buffer)) {
                                  // Continue sliced upload
                                  bytesUploaded = uploadFile.ContinueUpload(uploadId, fileoffset, s);
                                  ctx.ExecuteQuery();
                                  // update fileoffset for the next slice
                                  fileoffset = bytesUploaded.Value;
                              }
                          }
                      }
      
                  }
      
              }
          }
          catch(Exception ex) {
              this.Ex.Text = ex.ToString();
          }
          finally {
              if (fs != null) {
                  fs.Dispose();
      
              }
          }
          return uploadFile;
      }
      

      【讨论】:

      • 很好的研究,包括链接。请注意正确的代码格式(例如使用C# online formatter。如果您可以添加自己的解释,它将使您的答案更好:-)
      猜你喜欢
      • 1970-01-01
      • 2011-07-15
      • 2012-04-08
      • 1970-01-01
      • 2011-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多