【问题标题】:Open file directly from SharePoint path with CSOM使用 CSOM 直接从 SharePoint 路径打开文件
【发布时间】:2018-07-03 17:24:20
【问题描述】:

我有一台 SharePoint 服务器,我想使用 SharePoint CSOM 从服务器直接打开文件。

用户单击按钮 --> 文件(Excel、Word、...)在客户端计算机上使用标准软件打开。

直接意味着,如果我对文件进行更改并单击保存,则文件将直接保存在 SharePoint 服务器上(或者如果我在 Excel 中单击例如“另存为”,建议的路径为“https://sharpoint.url.com/folder”) .

其实我有:

using Microsoft.SharePoint.Client;

var clientContext = new ClientContext("https://sharpoint.url.com");
string relativePath = "/folder/file.xls";
clientContext.Credentials = CredentialCache.DefaultCredentials;
var file = clientContext.Web.GetFileByServerRelativeUrl(relativePath);

clientContext.Load(file);
clientContext.ExecuteQuery();

如果我想直接打开文件(不下载),我现在该怎么办?

【问题讨论】:

  • open the file directly (no download) 是什么意思?您有一个指向 Web 服务器上链接的文件。如果你想读取它,你需要将它下载到磁盘,或者从流中读取数据。您是否在问如何访问流而不是保存到磁盘?
  • 是否可以从流中打开文件?最后,我想要一个打开的 Excel 文件(使用客户端的 Excel 应用程序打开),如果我更改某些内容并点击“保存”,它应该直接保存在我的 SharePoint Server 中。
  • 文件流。但是,如果您希望 Excel 打开文件,则必须将其保存在本地,或将 URL 直接传递给 Excel。它已经知道如何打开 Sharepoint 文件。事实上,至少从 2003 年开始,SharePoint UI 就允许这样做。此外,只需单击 URL 就足以启动 Excel 并加载文件 IF 库和浏览器设置允许它。当您单击库中的 PDF 文件并看到它打开而不是保存时,情况是一样的。
  • 库设置控制发送 HTTP GET 请求以获取文件时发送的 content-disposition 标头的值。如果值为attachment,则必须保存文件。 浏览器 可能允许或阻止直接打开文件。最后,Excel 已经了解 SharePoint 和文档库,并且可以使用 URL 路径。
  • 顺便说一句,这些都与编程无关,它是 SharePoint 配置和 UI。许多人们认为的“SharePoint Development”只不过是配置和管理。 MSDN 文档也无济于事 - 它们实际上会因涵盖 SP 管理或解释功能及其使用方式而造成伤害。您会在 Technet 中找到它。多年来,人们在代码中创建 webpart 来改变网格的外观,因为 MSDN 没有解释 DataViewWebPart 是如何工作的,也没有解释如何从 UI 中设置网格的样式。

标签: c# sharepoint csom


【解决方案1】:

我们可以为 SharePoint 库创建 Map Network Drive,并从网络位置打开文件。查看以下文章:

http://support.sherweb.com/Faqs/Show/how-to-connect-to-a-sharepoint-site-using-webdav-sharepoint-2013

或者我们可以从 SharePoint 下载文件并使用以下代码打开它:

Application.Workbooks.Open(@"C:\Test\YourWorkbook.xlsx");

参考:https://msdn.microsoft.com/en-us/library/b3k79a5x.aspx

【讨论】:

  • 这根本不是 OP 所要求的。
  • 您只能在客户端机器运行WebClient服务,并且在SharePoint服务器网络上启用WebDAV时使用网络驱动器。 WebClient 在启动时不运行,出于安​​全原因,许多网络不允许使用 WebDAV
  • @LZ-SPWX:感谢您的回答,但这不是我要寻找的。该过程对用户应该是不可见的。他不应该注意到文件在哪里打开和关闭。
【解决方案2】:

我假设您询问如何访问文件的流而不是将其下载到本地文件夹。

您可以使用File.OpenBinaryDirect 方法来访问其ETag 和流,例如:

using(var fileInfo=File.OpenBinaryDirect(clientContext,"/folder/file.xls"))
using(var reader=new StreamReader(fileInfo.Stream))
{
    //Do whatever you want with the data
}

顺便说一句,您不应该使用旧的xls 文件。该格式已弃用 10 多年。当前的 Excel 格式 xlsx 是 XML 文件的压缩包,SharePoint 本身支持更好,不需要 Excel 生成或读取。

例如,如果您想从xlsx 文件中读取单元格值,您可以使用流行的 EPPlus 库直接从流中读取:

using(var fileInfo=File.OpenBinaryDirect(clientContext,"/folder/file.xlsx"))
using(var package=new ExcelPackage(fileInfo.Stream))
{
    var sheet=package.Workbook.Worksheets[0];
    var value=ws.Cells["A1"].Value;
    //...
}

更新

看来这个问题毕竟与编程无关。保存或打开 SharePoint 文档所需要做的就是单击文档的链接。然后会发生什么取决于站点和文档库级别的Open Documents in Client Applications 设置。

这会影响用户单击文档链接时服务器发送给浏览器的标题。 浏览器仍可能拒绝打开已注册的应用程序并显示Save 对话框。

如果这不起作用,您应该检查为什么而不是编写代码。这可能是配置错误或浏览器设置。解决它比创建变通办法、将它们推送到所有客户端计算机更容易。然后跟踪所有补丁、它们的部署位置和新补丁的部署。

除此之外,Office 应用程序自 2003 年以来就了解 SharePoint 和文档库。它们可以浏览它们、显示文档的 SharePoint 属性、显示协作者等。

正如我在问题 cmets 中提到的,很多人们认为的“SharePoint 开发”只不过是配置、管理和 最终用户 功能。

MSDN 文档也无济于事 - 它们实际上会因未涵盖 SP 管理或解释功能及其使用方式而造成伤害。您会在 Technet 中找到它。多年来,人们在代码中创建 webpart 来改变网格的外观,因为 MSDN 没有解释 DataViewWebPart 是如何工作的,也没有解释如何从 UI 中设置网格的样式。

一般来说,此类问题的最佳位置是http://sharepoint.stackexchange.com。比如勾选“Open in the client application” Vs “Use the server default (Open in the client application)” inside the document library advance settings

【讨论】:

  • 我已经阅读了File.OpenBinaryDirect 的几个主题。但是如何从StreamReader 打开文件? O 如何将流传递给 Excel?顺便说一句:xls 只是一个例子。我们使用xlsx
  • @Beetee 这不是您要求的,您不需要任何代码即可在 Excel 中打开 SharePoint 文件。 Excel 已经了解文档库,它可以直接从 URL 读取,甚至可以显示 SharePoint 文档的属性。
  • @Beetee 已更新,包括 sharepoin.stackexchange.com 中相关问题的链接
猜你喜欢
  • 2014-08-04
  • 1970-01-01
  • 2020-09-22
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-14
相关资源
最近更新 更多