【问题标题】:Download file from SharePoint 2013 with authentication通过身份验证从 SharePoint 2013 下载文件
【发布时间】:2018-06-29 10:27:02
【问题描述】:

我有一个 vb.net 工具,可以下载 *.从 SharePoint Server 压缩 文件。到目前为止,它在 SharePoint 2007 下工作。
SharePoint 2013 下,我不能再下载文件了。在 SharePoint 2013 下,用户必须通过浏览器中的此掩码身份验证端对自己进行身份验证。

这是适用于 SharePoint 2007 的旧解决方案

Dim WebIntranet As New WebClient
Dim strURL as String = "https://example.com/content/P123456/Documents/File.zip"

WebIntranet.UseDefaultCredentials = True
'Download the File from the Server
 WebIntranet.DownloadFile(strURL,
     "D:\Temp\File.zip ")

对于新的解决方案,它不起作用,我尝试了一些方法:

第一种方法:

Dim client As New WebClient 
Dim _UserAgend As String = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36"
Dim strURL as String = "https://example.com/content/P123456/Documents/File.zip"

client.Headers.Add(HttpRequestHeader.UserAgent, _UserAgend)

WebIntranet.DownloadFile(strURL,
     "D:\Temp\File.zip ")

第二步:

Dim securedPassword As SecureString = New SecureString
Dim _UserAgend As String = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36"
Dim username As String = "TestUser@Test.com"
Dim password As String = "123456"
client.Headers.Add(HttpRequestHeader.UserAgent, _UserAgend)


For Each c In password.ToCharArray()
    securedPassword.AppendChar(c)
Next
client.Headers.Add(HttpRequestHeader.UserAgent, _UserAgend)
client.Credentials = New NetworkCredential(username, securedPassword) WebIntranet.DownloadFile(strURL,
     "D:\Temp\File.zip ")

这两个 Approches 都不起作用,他们没有从 Sharepoint 下载文件。
他们只下载了 Authenticaton 端并将其命名为“File.zip”
欢迎任何帮助


来自下载的原始请求

【问题讨论】:

  • 首先检查原始请求以查看您得到的响应。虽然是的,但我们知道需要身份验证。原始响应应提供有关所需内容的低级线索。
  • @Nkosi 好的,会这样做。我如何获得原始请求?
  • 发出请求时可以使用 Fiddler 之类的东西来查看流量。

标签: .net vb.net sharepoint-2013 sharepoint-2007


【解决方案1】:

我不知道它是否适用于您的身份验证方法,但我可以下载这样的文件(设置对 Microsoft.SharePoint.ClientMicrosoft.SharePoint.Client 的引用.运行时):

Imports System.Security
Imports Microsoft.SharePoint.Client

...
Dim securePwd As SecureString
Dim credentials As SharePointOnlineCredentials
Dim list As List
Dim listItem As ListItem
Dim listItemFile As File
Dim fileRef As String
Dim fileInfo As FileInformation
Dim fileName As String

...
credentials = New SharePointOnlineCredentials(userName, securePwd)

Using context As ClientContext = New ClientContext(BASE_URL)
    context.Credentials = credentials

    list = context.Web.Lists.GetByTitle(LIST_TITLE)
    listItem = list.GetItemById(ITEM_ID)
    listItemFile = listItem.File

    context.Load(list)
    context.Load(listItem, Function(x As ListItem) x.File)
    context.Load(listItemFile, Function(x As File) x.ServerRelativeUrl)
    context.ExecuteQuery()

    fileRef = listItem.File.ServerRelativeUrl
    fileInfo = File.OpenBinaryDirect(context, fileRef)
    fileName = IO.Path.Combine(destinationPath, listItem.File.Name)

    Using stream As IO.FileStream = System.IO.File.Create(fileName)
        fileInfo.Stream.CopyTo(stream)
    End Using
End Using

BASE_URLLIST_TITLEITEM_ID 我是在浏览器中浏览要下载的文件时从 URL 得到的。

我希望这会有所帮助。

【讨论】:

  • Thakns,我明天早上试试
  • 我不确定,你从哪里得到 LIST_TITLE 和 ITEM_ID
  • 我登录了 Sharepoint 站点并导航到可以下载文件的列表。浏览器地址栏中的地址包含“Forms.AllItems”部分前面的 LIST_TITLE。我的地址栏显示:https://.sharepoint.com/sites/global/epd/ce/de/Department Documents/Forms/AllItems.aspx?...所以我的列表标题是“部门文件”。然后我将鼠标悬停在文件链接上。浏览器在左下角显示 URL。它包含类似“...&ListItemID=1234&...”的部分,所以我的 ITEM_ID 是 1234。
  • 在 context.ExecuteQuery() 上,他抛出了这个异常。 "远程服务器返回错误:(403) Forbidden"
  • 那么要么您使用了错误的 LIST_TITLE 和/或 ITEM_ID,要么我的方式不适用于您所需的身份验证方法。
【解决方案2】:

试试这个解决方案。不要忘记替换站点详细信息和凭据

    Using context As ClientContext = New ClientContext("https://example.com")
        context.Credentials = New NetworkCredential("TestUser@Test.com", "123456")
        Dim file As File = context.Web.GetFileByServerRelativeUrl("/content/P123456/Documents/File.zip")
        Dim filestrem As ClientResult(Of IO.Stream) = file.OpenBinaryStream()
        context.Load(file)
        context.ExecuteQuery()
        Using stream As IO.MemoryStream = New IO.MemoryStream()
            filestrem.Value.CopyTo(stream)
            IO.File.WriteAllBytes("D:\Temp\" + file.Name, stream.ToArray())
        End Using
    End Using

【讨论】:

  • 在 context.ExecuteQuery() 上,他抛出了这个异常。 "远程服务器返回错误:(403) Forbidden"
  • 你能用testuser代替testuser@test.com吗?
猜你喜欢
  • 2016-05-24
  • 2014-07-09
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 2017-08-06
  • 1970-01-01
  • 2015-07-22
相关资源
最近更新 更多