【问题标题】:Why the downloaded image from localhost using HttpWebRequest corrupted?为什么使用 HttpWebRequest 从 localhost 下载的图像损坏?
【发布时间】:2019-04-10 06:48:33
【问题描述】:

原始图像(.jpg)文件大小为 49kb,但下载后文件大小为 87kb,并且已损坏。但是对于文本文件,它可以工作。使用 HttpWebRequest 或其他 System.Net 类下载图像需要做什么? 我在本地使用 XAMPP。

//Usage: HttpDownload("http://www.localhost/files/imagine.jpg", "seo.jpg");

    static async void HttpDownload(string remoteFileOrUri, string localFileName)
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(remoteFileOrUri));
        HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync();
        StreamReader rdr = new StreamReader(response.GetResponseStream());
        StreamWriter sw = new StreamWriter(File.OpenWrite(localFileName));

        sw.Write(rdr.ReadToEnd());
        sw.Flush();

        rdr.Close();
        sw.Close();
        Console.WriteLine("fin!");
    }

【问题讨论】:

  • 您不应将StreamReaderStreamWriter 用于非文本内容。当您使用它们时,将应用编码。 Read this to find out more.

标签: c# io system.net


【解决方案1】:

您不应该将 StreamReader 和 StreamWriter 用于非文本的内容。当您使用它们时,将应用编码。编码不能与任意二进制数据很好地混合,this blog 将证明这一点。

您应该使用简单的FileStream:

using (var output = File.OpenWrite(localFileName))
{
    using (var responseStream = response.GetResponseStream())
    {
        await responseStream.CopyToAsync(output);
    }
}

很遗憾,这可能不是您唯一的问题,因为 GZip 压缩(如果服务器正在使用它)也可能会出现问题。您可以通过简单的设置更改来解决此问题:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(remoteFileOrUri));

request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;

HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync();

using (var output = File.OpenWrite(localFileName))
{
    using (var responseStream = response.GetResponseStream())
    {
        await responseStream.CopyToAsync(output);
    }
}

【讨论】:

  • 这个很好用但是为什么下载的文件和remoteFile的大小不一样?
  • 你如何测量远程文件的大小?
  • 右键单击文件,选择属性然后查看大小:
  • 我不知道为什么大小会不同。它们应该是逐字节相同的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多