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

如何用curl向Google Cloud Function上传文件?文件接收异常求助

解决Cloud Function中PUT请求无法获取上传文件的问题

我来帮你排查这个问题——你遇到的核心问题是curl的-T上传方式和Flask(Cloud Function基于Flask)处理文件的逻辑不匹配,导致request.files返回空字典。下面分两种方案帮你解决:

方案一:改用multipart/form-data格式上传文件(推荐)

Flask的request.files专门用来处理multipart/form-data类型的请求,而curl的-T选项是把文件内容直接作为PUT请求的原始体发送,不属于这个格式。你可以把curl命令改成用-F参数来模拟表单上传:

# 单文件上传
curl -i -F "uploaded_file=@myFile" https://Link-to-cloudfunction --verbose

# 多文件上传(多个-F参数)
curl -i -F "file1=@myFile1" -F "file2=@myFile2" https://Link-to-cloudfunction --verbose

这样修改后,你原来的代码不需要改动,request.files.to_dict()就能正确获取到上传的文件,后续的保存、清理逻辑都能正常执行。

方案二:适配curl -T的PUT上传方式

如果你一定要保留-T的上传方式,就需要直接读取PUT请求的原始体内容,而不是依赖request.files。修改你的Cloud Function代码如下:

import os

def get_file_path(file_name):
    # Cloud Function的临时可写目录是/tmp,确保路径指向这里
    return os.path.join('/tmp', file_name)

def hello_world(request):
    if request.method == 'GET':
        print('GET')
    elif request.method == 'PUT':
        print("PUT")
        # 处理-T上传的单个文件
        # 尝试从请求头获取文件名
        file_name = "uploaded_file"  # 默认文件名
        content_disposition = request.headers.get('Content-Disposition', '')
        if 'filename=' in content_disposition:
            file_name = content_disposition.split('filename=')[1].strip('"')
        
        # 读取请求体内容并保存到临时文件
        file_path = get_file_path(file_name)
        with open(file_path, 'wb') as f:
            f.write(request.get_data())
        print('Processed file: %s' % file_name)
        
        # 清理临时文件
        os.remove(file_path)
    return "Done!"

注意事项

  • Cloud Function的/tmp目录是临时存储空间,函数实例销毁后会被清空,不要用来持久化文件;
  • 如果用方案二,-T一次只能上传一个文件,多文件上传还是推荐方案一;
  • 可以在代码里添加print(request.headers)来查看请求头,确认文件名是否正确传递。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:40:52