我试图从HttpWebResponse下载并保存文件,但我在保存文件(文本文件除外)方面遇到了问题。
我认为这与这部分有关:
byte[] byteArray = Encoding.UTF8.GetBytes(http.Response.Content);
MemoryStream stream = new MemoryStream(byteArray);
文本文件可以正常使用上面的代码但是当我尝试将内容保存到图像文件时它会被破坏。 如何将此“字符串”数据写入图像文件(和其他二进制文件)
忘了提,这是.NET CP 3.5,我有一个围绕HttpWebResponse类的包装类来添加OAuth等。
答案 0 :(得分:50)
问题是你将二进制数据解释为文本,即使它不是 - 只要你开始将内容视为字符串而不是字节,你就会遇到麻烦。你没有给出你的包装类的细节,但我假设你的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);
}
}
答案 1 :(得分:7)
使用WebClient.DownloadFile。你可以手动完成(like this),但WebClient是简单下载的最佳选择。
答案 2 :(得分:0)
我发现最简单的方法是:
无需循环任何事情。以下上下文中的示例:
[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<byte[]> 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();
}
}