Sharepoint ClientObject 模型下载文件 C#

Sharepoint ClientObject Model download files C#

我正在尝试使用客户端对象模型从 SharePoint 库下载文件。我似乎能够使用 OpenBinaryStream() 访问文件,然后执行查询,但是当我尝试访问该流时,它是一个长度为 0 的流。我看过很多示例,并且尝试了几个,但我无法下载文件。我已经上传成功,凭据和权限不是问题。有人有什么想法吗?

public SharepointFileContainer DownloadFolder(bool includeSubfolders, params object[] path)
    {
        try
        {
            List<string> pathStrings = new List<string>();
            foreach (object o in path)
                pathStrings.Add(o.ToString());

            var docs = _context.Web.Lists.GetByTitle(Library);
            _context.Load(docs);
            _context.ExecuteQuery();
            var rootFolder = docs.RootFolder;
            _context.Load(rootFolder);
            _context.ExecuteQuery();
            var folder = GetFolder(rootFolder, pathStrings);
            var files = folder.Files;
            _context.Load(files);
            _context.ExecuteQuery();

            SharepointFileContainer remoteFiles = new SharepointFileContainer();

            foreach (Sharepoint.File f in files)
            {
                _context.Load(f);
                var file = f.OpenBinaryStream();

                _context.ExecuteQuery();

                var memoryStream = new MemoryStream();

                file.Value.CopyTo(memoryStream);
                remoteFiles.Files.Add(f.Name, memoryStream);
            }
...
}

SharepointFileContainer 只是我的调用应用程序的自定义 class,用于在处理完流后处理流。 GetFolder 是一种用于向下钻取给定文件夹路径的递归方法。我在提供直接 url 时遇到了问题,并且在这方面取得了最大的成功。

我的大问题是为什么 "file.Value" 是长度 == 0 的流?

提前致谢!

编辑: 感谢您到目前为止的输入...不幸的是,我遇到了同样的问题。两种解决方案都使用了 OpenBinaryDirect。生成的 FileInformation class 有流的这个...

我仍在下载一个 0 字节的文件。

您需要获取文件的列表项(作为 ListItem 对象),然后使用它的 属性 File。类似于:

//...
// Previous code
//...
 var docs = _context.Web.Lists.GetByTitle(Library);
 var listItem = docs.GetItemById(listItemId);
 _context.Load(docs);
 clientContext.Load(listItem, i => i.File);
 clientContext.ExecuteQuery();

 var fileRef = listItem.File.ServerRelativeUrl;
 var fileInfo = Microsoft.SharePoint.Client.File.OpenBinaryDirect(clientContext, fileRef);
 var fileName = Path.Combine(filePath,(string)listItem.File.Name);
 using (var fileStream = System.IO.File.Create(fileName))
 {                  
      fileInfo.Stream.CopyTo(fileStream);
 }

之后,您可以对流执行任何需要执行的操作。当前的只是保存到指定路径,不过你也可以在浏览器等下载.

我们可以使用下面的代码来获取内存流

var fileInformation = Microsoft.SharePoint.Client.File.OpenBinaryDirect(clientContext, file.ServerRelativeUrl);

if (fileInformation != null && fileInformation.Stream != null)
{
    using (MemoryStream memoryStream = new MemoryStream())
    {                
        byte[] buffer = new byte[32768];
        int bytesRead;
        do
        {
            bytesRead = fileInformation.Stream.Read(buffer, 0, buffer.Length);
            memoryStream.Write(buffer, 0, bytesRead);
        } while (bytesRead != 0);
    }
}

参考https://praveenkasireddy.wordpress.com/2012/11/11/download-document-from-document-set-using-client-object-model-om/