You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中从URL下载文件/图片?代码异常求助

问题分析与解决方案

你的C#代码存在几个关键问题,导致返回HTML而非目标图片,对比正常工作的curl命令就能明确差异:

核心问题点

  • Get请求携带了不必要的请求体:curl是纯Get请求,未发送任何请求体,但你的代码给Get请求添加了StringContent并设置application/json的Content-Type,这违反HTTP规范,服务器可能因此返回错误页面(HTML)。
  • Authorization头为空:curl中Bearer ACCESS_TOKEN是有效认证令牌,但你的代码里生成的是Bearer (空令牌),服务器验证失败后通常会返回登录页或错误HTML。
  • 用字符串读取二进制文件:图片是二进制数据,ReadAsStringAsync会将二进制转成UTF-8字符串,既损坏数据也无法直接保存为图片。

修正后的代码

方式一:使用HttpRequestMessage

using var httpClient = new HttpClient();
var httpRequest = new HttpRequestMessage(HttpMethod.Get, "https://samplesite.com/attachments=1234");

// 替换为你的有效ACCESS_TOKEN
httpRequest.Headers.Authorization = new AuthenticationHeaderValue("Bearer", "ACCESS_TOKEN");

var httpResponse = await httpClient.SendAsync(httpRequest);
httpResponse.EnsureSuccessStatusCode();

// 直接将响应流写入文件,避免数据损坏
using var fileStream = new FileStream("media_file.jpg", FileMode.Create, FileAccess.Write);
await httpResponse.Content.CopyToAsync(fileStream);

方式二:更简洁的GetAsync写法

using var httpClient = new HttpClient();
// 全局设置Authorization头,后续请求可复用
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "ACCESS_TOKEN");

var httpResponse = await httpClient.GetAsync("https://samplesite.com/attachments=1234");
httpResponse.EnsureSuccessStatusCode();

await httpResponse.Content.CopyToAsync(new FileStream("media_file.jpg", FileMode.Create));

代码说明

  • 移除了Get请求的Content相关代码,符合HTTP Get请求规范;
  • 使用AuthenticationHeaderValue正确设置认证令牌,确保服务器验证通过;
  • 通过CopyToAsync直接将响应流写入文件,避免二进制数据转字符串的损坏问题,同时提升传输效率。

内容的提问来源于stack exchange,提问作者Aniruddha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 23:03:12