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

使用C# HttpClient从Google Drive下载文件到字节数组失败

问题分析与解决方案

核心问题根源

你遇到的问题并非HttpClient基础逻辑错误,而是Google Drive的/view链接并非直接下载地址:

  • 这类链接返回的是Google Drive网页预览页面(HTML内容),大小刚好在75KB左右,和你看到的字节数匹配,所以你得到的是网页二进制数据,而非目标文件。
  • 代码中手动设置response.Content.Headers.ContentType属于无效操作,它不会改变服务器返回的实际内容类型,反而可能干扰后续处理。

解决步骤

1. 转换Google Drive链接为直接下载格式

将原链接:
https://drive.google.com/file/d/xxxxx/view?usp=share_link
替换为直接下载链接:
https://drive.google.com/uc?export=download&id=xxxxx
其中xxxxx是原链接中d/后面的文件ID。

2. 修正下载代码

移除错误的ContentType设置,简化代码(HttpClient内置直接读取字节数组的方法,无需手动处理流):

public static async Task<byte[]> ReadWebFileBinaryAsync(HttpClient httpClient, string webUrl)
{
    try
    {
        HttpResponseMessage response = await httpClient.GetAsync(webUrl);
        // 确保请求成功,否则抛出异常
        response.EnsureSuccessStatusCode();
        // 直接读取字节数组,无需手动处理MemoryStream
        return await response.Content.ReadAsByteArrayAsync();
    }
    catch (Exception ex)
    {
        // 可添加异常处理逻辑,比如记录日志或返回null
        throw;
    }
}

3. 处理特殊情况(可选)

如果遇到Google Drive返回的确认页面(部分公开文件需额外验证),可按以下方式处理:

  • 检查响应内容是否包含confirm=t参数,若有则构造新下载链接:https://drive.google.com/uc?export=download&id=xxxxx&confirm=t
  • 或在HttpClientHandler中启用自动Cookie处理:
httpClientHandler = new HttpClientHandler
{
    AllowAutoRedirect = true,
    MaxAutomaticRedirections = 20,
    UseCookies = true,
    CookieContainer = new CookieContainer()
};

验证说明

替换链接后,请求会直接获取目标文件的二进制数据,而非网页内容,此时返回的字节数组大小会与实际文件一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 10:22:45