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);
}
}
我正在尝试使用客户端对象模型从 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);
}
}