【问题标题】:Upload File from URL to Sharepoint将文件从 URL 上传到 Sharepoint
【发布时间】:2015-03-20 22:46:01
【问题描述】:

我想将文件从 URL 上传到 Sharepoint Online。我查找了各种类,我发现看起来不错的一个是WebClient,我尝试将已上传到我的应用程序网站的文件拉入流中,然后将该流上传到我在 Sharepoint 中的目标列表中,但所有我得到的是“403 Forbidden”异常。

    WebClient wc = new WebClient(); 
    wc.UseDefaultCredentials = true;
    wc.Headers.Add("User-Agent:Other");
        byte[] response = wc.DownloadData
("www.mysite-12345.sharepoint.com/sites/dev/myapp/lists/doclib/themefile.spfont");

        var uploadUrl = 
"www.mysite.sharepoint.com/_catalogs/theme/15/themefile.spfont";

        wc.UploadData
("www.mysite.sharepoint.com/_catalogs/theme/15/themefile.spfont", "POST", response);                       
  }

如果有人可以就我哪里出错或上传文件的替代方法给我一些建议,我将不胜感激。

【问题讨论】:

    标签: c# sharepoint csom


    【解决方案1】:

    我猜您不仅需要将文件上传到 SharePoint Online,还需要将文件从一个站点复制到另一个站点,对吧?

    在 SharePoint 中有多种下载/上传文件的方法,您可以使用特定的 SharePoint API,如 CSOM 或普通 .NET 功能(例如 HttpClient ClassWebClient Class),如下所示:

    var sourceWebUri = new Uri("https://sourcesite.sharepoint.com");
    var targetWebUri = new Uri("https://targetsite.sharepoint.com");
    var userName = "username@tenant.onmicrosoft.com";
    var password = "password";
    
    using(var sourceClient = GetClient(sourceWebUri,userName,password))
    {
        var fileContent = sourceClient.DownloadData(sourceWebUri + "/documents/SharePoint User Guide.docx");
        using(var targetClient = GetClient(targetWebUri,userName,password))
        {
             targetClient.UploadData(targetWebUri + "/documents/SharePoint User Guide.docx,"PUT" ,fileContent);
        }
     }
    

    在哪里

        private static WebClient GetClient(Uri webUri, string userName, string password)
        {
            var client = new WebClient();
            client.Credentials = GetCredentials(webUri, userName, password);
            client.Headers.Add("X-FORMS_BASED_AUTH_ACCEPTED", "f");
            return client;
        }
    
    
        private static SharePointOnlineCredentials GetCredentials(Uri webUri, string userName, string password)
        {
            var securePassword = new SecureString();
            foreach (var ch in password) securePassword.AppendChar(ch);
            return new SharePointOnlineCredentials(userName, securePassword);
        }
    

    如何通过 CSOM API 在 SharePoint Online 中的站点之间复制文件

    SharePoint CSOM API 包含用于从 SharePoint 下载文件的 File.OpenBinaryDirect method 和用于将文件上传到 SharePoint 的 File.SaveBinaryDirect method,以下示例演示了如何在站点之间复制文件

    public static void CopyFile(ClientContext sourceCtx, string sourceFileUrl, ClientContext targetCtx, string targetFileUrl)
    {
        if (sourceCtx.HasPendingRequest)
           sourceCtx.ExecuteQuery();
        using (var fileInfo = Microsoft.SharePoint.Client.File.OpenBinaryDirect(sourceCtx, sourceFileUrl))
        {
            Microsoft.SharePoint.Client.File.SaveBinaryDirect(targetCtx, targetFileUrl, fileInfo.Stream, true);
        }
    }
    

    用法

    using (var sourceCtx = GetSPOContext(sourceWebUri, userName, password))
    {
         using (var targetCtx = GetSPOContext(targetWebUri, userName, password))
         {
              CopyFile(sourceCtx, "/sourcesite/documents/SharePoint User Guide.docx", targetCtx, "/targetsite/documents/SharePoint User Guide.docx");
         }
    }
    

    在哪里

    public static ClientContext GetSPOContext(Uri webUri, string userName, string password)
    {
         var securePassword = new SecureString();
         foreach (var ch in password) securePassword.AppendChar(ch);
         return new ClientContext(webUri) { Credentials = new SharePointOnlineCredentials(userName, securePassword) };
    }
    

    先决条件

    SharePointOnlineCredentials class:

    表示提供凭据以访问 SharePoint 的对象 在线资源。

    SharePoint Online Client Components SDK的一部分

    【讨论】:

    • 您好 Vadim,感谢您的详细回复。是否可以使用客户端上下文并使用当前登录的用户进行身份验证,还是我们需要显式传递凭据?
    • 除了明确指定用户凭据之外,还有另一种请求访问 SharePoint 权限的方法称为 OAuth 流,请关注本文以获取更多详细信息msdn.microsoft.com/en-us/library/office/jj687470.aspx
    猜你喜欢
    • 2019-07-19
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多