使用.NET的WebRequest下载附件?

时间:2012-02-21 15:55:05

标签: .net

我已经开始使用WebRequest从给定的URL中检索文件。如果我在浏览器中点击URL,则会提示您下载该文件。我想把这个文件重定向到另一个URL。

我已经掌握了基础知识,但我不熟悉流媒体和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对象甚至是正确的方法吗?是否有更聪明的方式可以让我更轻松地访问该文件?

谢谢!

2 个答案:

答案 0 :(得分:1)

使用WebClient直接下载PDF。

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

答案 1 :(得分:0)

好吧,好像你正在尝试发送一个可能比文件短的缓冲区:

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