如何在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
相关产品推荐
相关产品推荐

