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

