C#从HTTP请求中保存文件

我试图从HttpWebResponse下载并保存文件,但我正确地保存文件(文本文件除外)有问题。

我认为这与这部分有关:

byte[] byteArray = Encoding.UTF8.GetBytes(http.Response.Content); MemoryStream stream = new MemoryStream(byteArray); 

使用上面的代码文本文件可以正常工作,但是当我尝试将内容保存到图像文件时,它会被破坏。 如何将此“字符串”数据写入图像文件(和其他二进制文件)

忘了提一下,这是.NET CP 3.5,我有一个围绕HttpWebResponse类的包装类来添加OAuth等。

问题是你将二进制数据解释为文本,即使它不是 – 只要你开始将内容视为字符串而不是字节,你就会遇到麻烦。 您还没有提供包装类的详细信息,但我假设您的Content属性返回一个字符串 – 您将无法使用它。 如果您的包装类不允许您从Web响应中获取原始数据,则需要对其进行修改。

如果您使用的是.NET 4,则可以使用新的CopyTo方法:

 using (Stream output = File.OpenWrite("file.dat")) using (Stream input = http.Response.GetResponseStream()) { input.CopyTo(output); } 

如果您不使用.NET 4,则必须手动进行复制:

 using (Stream output = File.OpenWrite("file.dat")) using (Stream input = http.Response.GetResponseStream()) { byte[] buffer = new byte[8192]; int bytesRead; while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0) { output.Write(buffer, 0, bytesRead); } } 

使用WebClient.DownloadFile 。 你可以手动完成( 类似这样 ),但WebClient是简单下载的最佳选择。

我找到的最简单的方法是:

  • 使用ReadAsByteArrayAsync获取数据。
  • 列出项目File.WriteAllBytes以保存文件。

无需循环任何东西。 以下上下文中的示例:

 [TestClass] public class HttpTests { [TestMethod] public void TestMethod1() { var jsObject = (dynamic)new JObject(); jsObject.html = "samplehtml.html"; jsObject.format = "jpeg"; const string url = "https://mywebservice.com/api"; var result = GetResponse(url, jsObject).GetAwaiter().GetResult(); File.WriteAllBytes($@"c:\temp\httpresult.{jsObject.format}", result); } static async Task GetResponse(string uri, dynamic jsObj) { var httpClient = new HttpClient(); var load = jsObj.ToString(); var content = new StringContent(load, Encoding.UTF8, "application/json"); var response = await httpClient.PostAsync(uri, content); return await response.Content.ReadAsByteArrayAsync(); } }