使用http响应如何保存pdf文件

时间:2011-01-28 05:27:31

标签: c#

我编写了以下代码来从网页获取内容并保存到系统中。 如果网页是html格式,我可以保存它。 如果网页是pdf格式,我无法保存。保存后,如果我打开文件,空白页面即将到来。

我想知道如何从响应中保存pdf文件。

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(Url);
WebResponse response = request.GetResponse();
Stream stream = response.GetResponseStream();
StreamReader reader = new StreamReader(stream);
webContent = reader.ReadToEnd();
StreamWriter sw = new StreamWriter(FileName);
sw.WriteLine(webContent);
sw.Close();

请尽快帮助我。

2 个答案:

答案 0 :(得分:14)

StreamReader.ReadToEnd()返回一个字符串。 PDF文件是二进制文件,包含非字符串友好的数据。您需要将其读入字节数组,并将字节数组写入磁盘。更好的是,使用较小的字节数组作为缓冲区并以小块读取。

您还可以通过使用webclient来简化整个过程:

using (var wc = new System.Net.WebClient())
{
    wc.DownloadFile(Url, FileName);
}

答案 1 :(得分:6)

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(Url);
WebResponse response = request.GetResponse();

using (Stream stream = response.GetResponseStream())
using (FileStream fs = new FileStream(FileName, FileMode.Create, FileAccess.Write, FileShare.None))
{
    stream.BlockCopy(fs);
}

...
public static class StreamHelper
{
    public static void Copy(Stream source, Stream target, int blockSize)
    {
        int read;
        byte[] buffer = new byte[blockSize];
        while ((read = source.Read(buffer, 0, blockSize)) > 0)
        {
            target.Write(buffer, 0, read);
        }
    }
    public static void BlockCopy(this Stream source, Stream target, int blockSize = 65536)
    {
        Copy(source, target, blockSize);
    }
}