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

为何使用WebClient无法下载指定图片链接?仅用WebClient解决

解决WebClient下载特定3M图片链接超时且生成0字节文件的问题

问题背景

目标链接:https://multimedia.3m.com/mws/media/777955P/3mtm-scotchcaltm-graphic-film-7755se-420-mirror-silver.jpg
使用WebClient异步下载该链接时,会生成0字节文件并超时,但UnityWebRequest、HttpClient可正常下载,且WebClient处理其他多数图片链接无异常。要求必须使用WebClient完成下载。

问题分析

3M的媒体服务器对请求完整性要求较高,原代码请求头不全,且缺少必要的错误处理与资源释放逻辑,导致服务器拒绝响应或WebClient无法正确处理返回结果。

解决方案

修改请求头模拟浏览器行为,完善错误处理逻辑,以下是调整后的代码:

using System;
using System.IO;
using System.Net;

class WebClientDownloadFix
{
    static void Main(string[] args)
    {
        string imageUrl = "https://multimedia.3m.com/mws/media/777955P/3mtm-scotchcaltm-graphic-film-7755se-420-mirror-silver.jpg";
        using (WebClient client = new WebClient())
        {
            var name = Path.GetFileName(imageUrl);
            // 用Path.Combine避免路径分隔符问题
            var localPath = Path.Combine(@"C:\_Temp", name);

            // 补充完整请求头,模拟现代浏览器请求
            client.Headers.Add(HttpRequestHeader.UserAgent, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36");
            client.Headers.Add(HttpRequestHeader.Accept, "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8");
            client.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate, br");
            client.Headers.Add(HttpRequestHeader.AcceptLanguage, "zh-CN,zh;q=0.9");
            client.Headers.Add(HttpRequestHeader.Connection, "keep-alive");
            // 延长超时时间,避免大文件下载超时
            client.Timeout = 30000;

            // 绑定下载完成事件,处理结果与错误
            client.DownloadFileCompleted += (sender, e) =>
            {
                if (e.Error != null)
                {
                    Console.WriteLine($"下载失败:{e.Error.Message}");
                    // 清理无效的0字节文件
                    if (File.Exists(localPath))
                    {
                        File.Delete(localPath);
                    }
                }
                else if (e.Cancelled)
                {
                    Console.WriteLine("下载已取消");
                }
                else
                {
                    Console.WriteLine($"下载完成:{localPath}");
                }
            };

            // 启动异步下载
            client.DownloadFileAsync(new Uri(imageUrl), localPath);
            Console.WriteLine("下载任务已启动...");
            // 控制台程序需保持运行,等待下载完成(UI程序可忽略此句)
            Console.ReadLine();
        }
    }
}

关键改动说明

  1. 补充完整请求头:添加浏览器常用的Accept-Encoding、Accept-Language等字段,让请求更贴近真实浏览器行为,避免被服务器拦截。
  2. 延长超时时间:设置30秒超时,应对大文件或网络波动导致的超时问题。
  3. 完善错误处理:在下载完成事件中捕获错误,自动清理下载失败生成的0字节文件。
  4. 使用using语句:确保WebClient资源被正确释放,避免资源泄漏。
  5. 规范路径拼接:用Path.Combine替代字符串拼接,避免跨平台或路径分隔符错误。

备选测试方案

如果异步下载仍有问题,可尝试同步下载方式排查:

using (WebClient client = new WebClient())
{
    // 同样添加上述完整请求头
    client.Headers.Add(HttpRequestHeader.UserAgent, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36");
    client.Headers.Add(HttpRequestHeader.Accept, "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8");
    client.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate, br");
    client.Timeout = 30000;

    try
    {
        client.DownloadFile(imageUrl, localPath);
        Console.WriteLine("同步下载成功");
    }
    catch (Exception ex)
    {
        Console.WriteLine($"同步下载失败:{ex.Message}");
        if (File.Exists(localPath)) File.Delete(localPath);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 08:47:29