Docker部署的Flask微服务MP4播放器文件上传异常:文件被保存为'file'而非原文件名
Docker部署的Flask微服务MP4播放器文件上传异常:文件被保存为'file'而非原文件名
嘿,我帮你分析下这个问题——从你贴的日志和代码来看,核心问题出在上传服务向文件系统服务传递文件时,没有正确携带原始文件名和MIME类型,导致文件系统服务接收到的文件对象丢失了原信息,只能用默认的file作为文件名保存。
问题根源
你在upload_app.py里用requests.post发送文件时,直接传了Flask的FileStorage对象:
storage_response = requests.post('http://file-system-service:5003/store', files={'uploaded_file': file})
但requests在处理这种直接传递的FileStorage对象时,并不会自动携带原始文件名和文件类型,所以文件系统服务拿到的uploaded_file的文件名变成了默认的file,MIME类型为None(就是日志里显示的<FileStorage: 'file' (None)>)。
解决步骤
1. 修改上传服务的文件传递逻辑
在upload_app.py里,把发送文件的代码改成显式指定文件名、文件对象和MIME类型的格式:
# 替换原来的storage_response请求代码 storage_response = requests.post( 'http://file-system-service:5003/store', files={'uploaded_file': (file.filename, file, file.content_type)} )
这样requests就会把原始文件名和正确的MP4类型(比如video/mp4)传递给文件系统服务。
2. 确保文件系统服务正确使用原始文件名
你贴的file_system_app.py看起来和upload_app.py重复了,应该是粘贴错误。正确的/store端点代码应该是这样的(用来接收并保存文件):
from flask import Flask, request import os app = Flask(__name__) app.secret_key = 'your_secret_key' @app.route('/store', methods=['POST']) def store_file(): uploaded_file = request.files.get('uploaded_file') if not uploaded_file: return "No file received", 400 # 确保上传目录存在(Docker容器里可能需要提前创建) upload_dir = '/app/uploads' if not os.path.exists(upload_dir): os.makedirs(upload_dir, exist_ok=True) # 使用原始文件名保存文件 file_path = os.path.join(upload_dir, uploaded_file.filename) uploaded_file.save(file_path) # 返回保存的文件路径给上传服务 return file_path, 200 if __name__ == '__main__': app.run(host='0.0.0.0', port=5003)
这里关键是用uploaded_file.filename获取原始文件名,而不是默认的file。
3. 额外检查项
- Docker目录权限:确保文件系统服务容器里的
/app/uploads目录有写入权限,可以在Dockerfile里添加:RUN mkdir -p /app/uploads && chmod 755 /app/uploads - 前端表单验证:确认前端表单的文件输入框
name属性是file,且用户确实上传了带有正确扩展名的MP4文件(比如test.mp4)。 - Requests版本:如果你的
requests版本太旧,可能存在文件传递的bug,建议升级到最新稳定版:pip install --upgrade requests
备注:内容来源于stack exchange,提问作者qleqs
相关产品推荐
相关产品推荐

