2012-02-21 51 views
0

我已經開始使用WebRequest從給定的URL中檢索文件。如果我在瀏覽器中輸入網址,我只會提示下載該文件。我想把這個文件並重定向到另一個URL。使用.NET的WebRequest下載附件?

我已經掌握了基本的工作原理,但我並不熟悉流和HTTP,所以我有點失落。我知道以下代碼不起作用,因爲寫入的文件也包含所有額外的http響應,並且文件在另一端(本例中爲PDF文件)最終損壞:

 var toRequest = WebRequest.Create(destinationUrl); 
     toRequest.Method = "PUT"; 
     toRequest.UseDefaultCredentials = true; 
     toRequest.ContentType = "application/octet-stream"; 

     var fromRequest = WebRequest.Create(reportUrl); 
     fromRequest.UseDefaultCredentials = true; 
     fromRequest.Method = "GET"; 
     fromRequest.ContentType = "application/octet-stream"; 


     var buffer = new byte[10240]; 
     int bytesRead = 0; 
     int totalBytesRead = 0; 
     Stream responseStream; 

     do 
     { 
      responseStream = fromRequest.GetResponse().GetResponseStream(); 
      if (responseStream != null) 
      { 
       bytesRead = responseStream.Read(buffer, 0, buffer.Length); 
       logger.Info(String.Format("Read {0} bytes", bytesRead)); 
      } 
      totalBytesRead += bytesRead; 
     } while (bytesRead > 0); 

     toRequest.ContentLength = totalBytesRead; 
     var writer = new BinaryWriter(toRequest.GetRequestStream()); 
     writer.Write(buffer, 0, totalBytesRead); 

     HttpWebResponse response = (HttpWebResponse)toRequest.GetResponse(); 
     response.Close(); 

     if (responseStream != null) responseStream.Close(); 


     writer.Close(); 

在我的測試場景中,「reportUrl」是一個SSRS生成的PDF文件。同樣,直接在瀏覽器中點擊此鏈接會導致提示將文件保存到我的機器。我想讓我的代碼把這個文件重定向到「destinationUrl」,這個文件就像「http://testserver/folder/report.pdf」。

再次,基礎工作,但「report.pdf」文件已損壞,無法加載,因爲它目前包含額外的SSRS生成的元數據:

1 >> 
endobj 
7 0 obj 
<< /Type /Catalog /Pages 6 0 R >> 
endobj 
8 0 obj 
<< /Title <feff004300680061006e0067006500470075006900640065> 
/Author <> 
/Subject <> 
/Creator (Microsoft Reporting Services 10.0.0.0) 
/Producer (Microsoft Reporting Services PDF Rendering Extension 10.0.0.0) 
/CreationDate (D:20120221083306-07'00') 
>> 

所以,即使是在WebRequest對象正確的方法來做到這一點?會不會有更聰明的方式讓我更容易訪問文件?

謝謝!

回答

1

使用Web客戶端可以直接下載PDF。

http://www.csharp-examples.net/download-files/

+0

不知道它是否真的是「正確」的解決方案......如果這種流式比「下載然後上傳」更流暢,但使用WebClient API工作並且運行良好,我寧願選擇它。謝謝! – 2012-02-21 16:36:44

0

嗯,好像你要發送的緩衝區可能比你的文件更短:

writer.Write(buffer, 0, totalBytesRead); //totalBytesRead may be > 10240 
+0

我不這麼認爲,如果有什麼是比文件,因爲它包括標題信息,我不想長。 – 2012-02-21 16:01:20