【问题标题】:Open filestream from sharepoint file从共享点文件打开文件流
【发布时间】:2020-04-09 11:12:09
【问题描述】:

我想从共享点文件 (Microsoft.SharePoint.Client.File) 打开文件流,但我似乎不知道如何操作。

我只能访问Microsoft.SharePoint.Client,因为Microsoft.SharePoint包由于一些错误无法安装。

这是我目前的代码:

ClientContext ctx = new ClientContext("https://factionxyz0.sharepoint.com/sites/faktion-devs");
ctx.Credentials = CredentialCache.DefaultCredentials;
Microsoft.SharePoint.Client.File temp = ctx.Web.GetFileByServerRelativeUrl(filePath);
FileStream fs = new FileStream(???);

【问题讨论】:

    标签: c# sharepoint filestream


    【解决方案1】:

    如果文件存在于物理磁盘上(或通过操作系统映射到磁盘),您只能创建 System.IO.FileStream。

    解决方法:您是否能够访问文件的原始 URL?在这种情况下,将文件下载到磁盘(如果大小合适),然后从那里读取。

    例如:

    var httpClient = new HttpClient();
    
    // HTTP GET Request
    var response = await httpClient.GetAsync(... SharePoint URL ...);
    
    // Get the Content Stream
    var stream = await response.Content.ReadAsSteamAsync();
    
    
    // Create a temporary file
    var tempFile = Path.GetTempFileName();
    
    using (var fs = File.OpenWrite(tempFile))
    {
       await stream.CopyToAsync(fs);
    }
    
    // tempFile now contains your file locally, you can access it like
    var fileStream = File.OpenRead(tempFile);
    
    // Make sure you delete the temporary file after using it
    File.Delete(tempFile);
    

    【讨论】:

    • 这看起来不错,但是 azure 函数是否可以访问用户的文件系统?
    【解决方案2】:

    FileStream 必须映射到文件。以下代码演示了如何通过 CSOM 获取流,然后我们可以使用临时文件将其转换为 FileStream。

    ResourcePath filepath = ResourcePath.FromDecodedUrl(filename);
    
    Microsoft.SharePoint.Client.File temp = context.Web.GetFileByServerRelativePath(filepath);
    
    ClientResult<System.IO.Stream> crstream = temp.OpenBinaryStream();
    
    context.Load(temp);
    context.ExecuteQuery();
    
    var tempFile = Path.GetTempFileName();
    FileStream fs = System.IO.File.OpenWrite(tempFile);
    
    if (crstream.Value != null){
          crstream.Value.CopyTo(fs);
    }
    

    关于 Azure 函数临时存储,您可以参考以下线程: Azure Functions Temp storage 或者,您可以将数据存储到 Azure 存储: Upload data to blob storage with Azure Functions

    最好的问候, 贝克岗

    【讨论】:

    • 奇怪的是,我无法访问 SharePoint 文件上的 OpenBinaryStream() 方法?
    • 您是否正确引用了这些软件包?这个方法在 Microsoft.SharePoint.Client.dll.(docs.microsoft.com/en-us/previous-versions/office/…)
    • 我没有找到微软提供的那个包,只有faisal提供的那个,当我安装那个包时,我仍然无法访问那个方法
    • 我找到了这个包但是我不能安装它:Package Microsoft.SharePoint.dll 15.0.4867.1000 is not compatible with netcoreapp2.1 (.NETCoreApp,Version=v2.1). Package Microsoft.SharePoint.dll 15.0.4867.1000 supports: microsoftsharepoint (Microsoft.SharePoint,Version=v0.0)
    • Microsoft.SharePoint.dll 是服务器端代码。 ClientContext 位于 Microsoft.SharePoint.Client (CSOM) 中。您可以从 nuget 获得它:nuget.org/packages/Microsoft.SharePointOnline.CSOM。并在函数中引用它:docs.microsoft.com/en-us/azure/azure-functions/…
    【解决方案3】:

    自从提出问题以来已经有一段时间了,但是,这就是我在处理项目时解决这个问题的方法。显然,像这样直接传递凭据不是最好的方法,但由于时间限制,我无法将此项目转换为较新版本的 .NET 并使用 Azure AD。

    请注意,该类正在实现一个接口。

    public void SetServer(string domainName) {
        if (string.IsNullOrEmpty(domainName)) throw new Exception("Invalid domain name. Name cannot be null");
        _server = domainName.Trim('/').Trim('\\');
    }
    
    private string MapPath(string urlPath) {
        var url = string.Join("/", _server, urlPath);
        return url.Trim('/');
    }
    
    public ISharePointDocument GetDocument(string path, string fileName) {
        var serverPath = MapPath(path);
        var filePath = string.Join("/", serverPath, TemplateLibrary, fileName).Trim('/');
        var document = new SharePointDocument();
        var data = GetClientStream(path, fileName);
    
        using(var memoryStream = new MemoryStream()) {
            if (data == null) return document;
            data.CopyTo(memoryStream);
            var byteArray = memoryStream.ToArray();
            document = new SharePointDocument {
                FullPath = filePath,
                Bytes = byteArray
            };
        }
    
        return document;
    }
    
    public Stream GetClientStream(string path, string fileName) {
        var serverPath = MapPath(path);
        var filePath = string.Join("/", serverPath, TemplateLibrary, fileName).Trim('/');
        var context = GetClientContext(serverPath);
    
        var web = context.Web;
    
        context.Load(web);
        context.ExecuteQuery();
    
        var file = web.GetListItem(filePath).File;
        var data = file.OpenBinaryStream();
    
        context.Load(file);
        context.ExecuteQuery();
    
        return data.Value;
    }
    
    private static ClientContext GetClientContext(string serverPath) {
        var context = new ClientContext(serverPath) {
            Credentials = new SharePointOnlineCredentials("example@example.com", GetPassword())
        };
    
        return context;
    }
    
    private static SecureString GetPassword() {
        const string password = "XYZ";
        var securePassword = new SecureString();
    
        foreach(var c in password.ToCharArray()) securePassword.AppendChar(c);
    
        return securePassword;
    }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-20
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2011-12-23
      • 1970-01-01
      相关资源
      最近更新 更多