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

IDM如何获取Google Drive文件大小?C# Chrome集成下载管理器求助

解决Google Drive下载时无法获取Content-Length的问题

我之前也遇到过类似的情况,Google Drive的公开下载链接返回的响应经常是Transfer-Encoding: chunked,不会直接返回Content-Length,但IDM这类工具确实能拿到文件大小——核心原因是它们会主动发送HTTP Range请求来探测总文件大小,而不是只依赖初始响应头。

下面是具体的实现逻辑和C#代码示例:

核心原理

Google Drive的服务器支持HTTP范围请求(Range Requests)。当你发送一个只请求文件前0-0字节的Range请求时,服务器会返回206 Partial Content状态码,同时在响应头的Content-Range字段中包含文件的总大小,格式类似:Content-Range: bytes 0-0/{total_size}。我们只需要解析这个字段就能拿到准确的文件大小。

C#实现步骤

1. 发送Range请求探测文件大小

使用HttpClient发送带有Range: bytes=0-0头的GET请求,解析响应中的Content-Range头:

using System;
using System.Net.Http;
using System.Threading.Tasks;

public class DriveDownloadHelper
{
    public static async Task<long?> GetGoogleDriveFileSize(string downloadUrl)
    {
        using (var httpClient = new HttpClient())
        {
            // 设置User-Agent,模拟浏览器或IDM,避免被Google限制
            httpClient.DefaultRequestHeaders.UserAgent.ParseAdd(
                "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
            );

            var request = new HttpRequestMessage(HttpMethod.Get, downloadUrl);
            // 请求只获取第0个字节
            request.Headers.Range = new System.Net.Http.Headers.RangeHeaderValue(0, 0);

            try
            {
                var response = await httpClient.SendAsync(request);
                response.EnsureSuccessStatusCode();

                // 检查是否返回了Content-Range头
                if (response.Content.Headers.ContentRange != null && 
                    response.Content.Headers.ContentRange.Length.HasValue)
                {
                    return response.Content.Headers.ContentRange.Length.Value;
                }
                else
                {
                    // 少数情况服务器不支持Range请求,比如极小文件
                    return null;
                }
            }
            catch (HttpRequestException ex)
            {
                Console.WriteLine($"请求出错: {ex.Message}");
                return null;
            }
        }
    }

    // 测试调用
    public static async Task Main()
    {
        string url = "https://drive.google.com/uc?export=download&confirm=-wOm&id=1gC_fEKIlv9oaLQUAKH4GvRvAIqhDgAbz";
        long? fileSize = await GetGoogleDriveFileSize(url);
        
        if (fileSize.HasValue)
        {
            Console.WriteLine($"文件总大小: {fileSize.Value / 1024 / 1024:F2} MB");
        }
        else
        {
            Console.WriteLine("无法获取文件大小");
        }
    }
}

2. 额外注意事项

  • User-Agent设置:Google会对请求的UA做校验,尽量使用主流浏览器或IDM的UA字符串,避免请求被拦截。
  • Confirm参数处理:你的链接已经包含了confirm=-wOm,这是Google Drive的下载确认参数,确保能直接进入下载流程;如果没有这个参数,初始请求可能会返回一个跳转页面,需要先提取这个confirm参数再发起请求。
  • 权限验证:如果是需要登录才能下载的文件,你需要在HttpClient中携带有效的Cookie或OAuth令牌,否则Range请求会返回403或401状态码。

为什么IDM能做到?

IDM这类下载器的逻辑就是:当初始响应没有Content-Length时,自动尝试发送Range请求来获取文件总大小,这样就能显示准确的下载进度。它还会同时开启多个Range请求进行分块下载,提升速度——这也是你可以扩展的方向。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 20:27:36