如何從aspx頁面下載文件並繞過保存文件對話框?嘗試使用WebClient下載文件時出現重定向問題
我正在嘗試從網頁下載文件並遇到問題。這個想法是爲了避免響應保存文件對話框,並將文件直接保存到我的電腦。
該網頁需要憑據。因此,我目前使用WebBrowser控件登錄並導航到具有生成下載按鈕的頁面。然後,我使用的代碼是here(16個ish upvotes的代碼,基本上使用來自「wininet.dll」的InternetGetCookieEx來提取cookie)。
使用Fiddler2,我可以看到按下按鈕會生成POST請求。我模仿下面的請求。
我的代碼我試圖至今:
Dim testUri As New Uri(WebBrowser1.Url.ToString)
request = WebRequest.Create(WebBrowser1.Url.ToString)
Dim c = Cookies.GetUriCookieContainer(testUri)
With request
.Method = "POST"
.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; InfoPath.2; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E)"
.CookieContainer = Cookies.GetUriCookieContainer(testUri)
.ContentLength = 0
.ContentType = "application/x-www-form-urlencoded"
.AllowAutoRedirect = True
End With
Dim response = request.GetResponse
Console.WriteLine(response.ResponseUri)
Console.WriteLine(response.ContentType)
Dim wc As New WebClient
wc.Headers.Add(HttpRequestHeader.Cookie, c.GetCookieHeader(response.ResponseUri))
wc.DownloadFile(response.ResponseUri, "C:\report.xls")
餅乾是一類我寫持有該鏈接的代碼(以下,如果它不工作) 進口System.Net 進口System.Text
Public Class Cookies
<Runtime.InteropServices.DllImport("wininet.dll")> _
Private Shared Function InternetGetCookieEx(ByVal url As String, ByVal cookieName As String, _
ByVal cookieData As StringBuilder, ByRef size As Integer, _
ByVal dwFlags As Int32, ByVal lpReserved As IntPtr) As Boolean
End Function
Const InternetCookieHttponly As Int32 = &H2000
Public Shared Function GetUriCookieContainer(ByVal uri As Uri) As CookieContainer
Dim cookies As CookieContainer = Nothing
Dim datasize As Integer = 8192 * 16
Dim cookieData As StringBuilder = New StringBuilder(datasize)
If Not InternetGetCookieEx(uri.ToString, Nothing, cookieData, datasize, InternetCookieHttponly, IntPtr.Zero) Then
If datasize < 0 Then
Return Nothing
End If
cookieData = New StringBuilder(datasize)
If Not InternetGetCookieEx(uri.ToString, Nothing, cookieData, datasize, InternetCookieHttponly, IntPtr.Zero) Then
Return Nothing
End If
End If
If cookieData.Length > 0 Then
cookies = New CookieContainer
cookies.SetCookies(uri, cookieData.ToString.Replace(";", ","))
'Console.WriteLine(cookieData.ToString.Replace(";", ","))
End If
Return cookies
End Function
End Class
設置的cookies工作正常,但我的實際要求不返回數據預期,這僅僅是你救了我的網頁(時髦的副本,因爲我試圖用Excel打開它。如果我將它保存爲文本,我將HTML發送給誰le page)。
按鈕的頁面上的代碼似乎沒有指向任何東西。我找不到任何對列出的jQuery的引用 - 我可能不得不模仿它?
<td align="center" id="excel_cell" noWrap="nowrap" style="width: 50px;">
<input name="xcel" title="Send report to excel" id="xcel" style="background-image: url(../resx/images/excel.png); BORDER-BOTTOM: medium none; border-left: medium none; background-color: transparent; width: 32px; background-repeat: no-repeat; height: 32px; border-top: medium none; cursor: pointer; border-right: medium none;" type="button" jQuery1710025381725129178523="48"/>
Text - Empty Text Node
我已經嘗試只是「點擊」,在網頁瀏覽器的按鈕,
WebBrowser1.Document.Window.Document.GetElementById("xcel").InvokeMember("click")
但我試圖隱藏從用戶的保存文件對話框,並自動完成整個過程。
任何幫助將大大appriciated!
編輯:修正!
解決方案 - 我需要添加到頭部,另外,我需要糾正我的POST數據
Dim postData As String = xxxx
Dim byteArray As Byte() = Encoding.UTF8.GetBytes(postData)
Dim dataStream As Stream = request.GetRequestStream
dataStream.Write(byteArray, 0, byteArray.Length)
dataStream.Close()
我會研究這個,這是一個好主意。謝謝,一旦我有機會進一步測試,我會更新。 – 2014-09-02 14:25:21
真棒,我很高興爲你工作!你需要添加哪些標題? – 2014-09-04 14:26:20
我錯過了「AcceptEncoding:gzip,deflate」以及需要稍微調整我的發佈數據的內容。 – 2014-09-04 15:20:15