我已經開始使用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對象正確的方法來做到這一點?會不會有更聰明的方式讓我更容易訪問文件?
謝謝!
不知道它是否真的是「正確」的解決方案......如果這種流式比「下載然後上傳」更流暢,但使用WebClient API工作並且運行良好,我寧願選擇它。謝謝! – 2012-02-21 16:36:44