首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么使用HttpWebRequest从本地主机下载的镜像损坏?

为什么使用HttpWebRequest从本地主机下载的镜像损坏?
EN

Stack Overflow用户
提问于 2019-04-10 14:48:34
回答 1查看 50关注 0票数 4

原始图像(.jpg)文件大小为49kb,但当我下载它后,文件大小为87kb且已损坏。但是对于文本文件,它是有效的。使用HttpWebRequest或其他System.Net类下载图片需要做什么?我将XAMPP用于本地主机。

代码语言:javascript
复制
//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!");
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-10 14:58:26

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

相反,您应该使用简单的FileStream

代码语言:javascript
复制
using (var output = File.OpenWrite(localFileName))
{
    using (var responseStream = response.GetResponseStream())
    {
        await responseStream.CopyToAsync(output);
    }
}

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

代码语言:javascript
复制
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);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55606343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档