2014-08-29 88 views
1

如何從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() 

回答

0

我從所提供的信息假設至今沒有需要列入領域POST。如果是這種情況,我建議您使用Fiddler進行更深入的分析,以比較您的代碼與在Web瀏覽器中手動執行的代碼的請求。這可能是因爲您需要發送服務器端代碼正在檢查的其他標頭。如果存在差異,並且您可以優化代碼直到100%模擬手動請求的外觀,那麼您很有可能通過淘汰過程來解決這個問題。

例如,您可能會發現他們正在尋找要設置的「referer」標題。在這種情況下,添加另一行到您的標題代碼:

wc.Headers.Add("Referer", yourReferringUrl); 
+0

我會研究這個,這是一個好主意。謝謝,一旦我有機會進一步測試,我會更新。 – 2014-09-02 14:25:21

+0

真棒,我很高興爲你工作!你需要添加哪些標題? – 2014-09-04 14:26:20

+0

我錯過了「AcceptEncoding:gzip,deflate」以及需要稍微調整我的發佈數據的內容。 – 2014-09-04 15:20:15

相關問題