c# - 为什么使用 HttpWebRequest 从 localhost 下载的图像损坏?
问题描述
原始图像(.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!");
}
解决方案
您不应该将 StreamReader 和 StreamWriter 用于非文本的内容。当您使用它们时,将应用编码。编码不能与任意二进制数据很好地混合,本博客将证明这一点。
相反,您应该使用简单的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);
}
}
推荐阅读
- unity3d - 如何在导航网格中将玩家从一个网格移动到另一个网格
- arrays - 在工作表 1 中使用 2 列中的 FROM 和 TO 日期搜索特定日期,然后将工作表 1 中同一行中的列中的数据粘贴到工作表 2
- django - 我正在尝试在谷歌应用引擎上运行 django wagtail 演示应用。应用已部署,GCP 报错没有错误
- java - 除非重新启动应用程序,否则无法从 DAO 获取最新数据
- c# - 使用 .Net C# IMAP 客户端从 Exchange Server 读取 Office365 电子邮件
- reactjs - 使用 Material UI 悬停按钮时如何更改边框颜色
- css - 无法更改字体系列(React-Native)
- python - 如何应用 BlurEffect(QtWidgets.QGraphicsBlurEffect) 两次?
- visio - 如何阅读 Visio 流程
- javascript - 标记只执行两个功能之一