【发布时间】:2020-02-17 12:55:09
【问题描述】:
我有一个用于上传文件的 HTML 表单(在 Flask 中实现)。我想将上传的文件直接存储到S3。
Flask实现的相关部分如下:
@app.route('/',methods=['GET'])
def index():
return '<form method="post" action="/upload" enctype="multipart/form-data"><input type="file" name="file" /><button>Upload</button></form>'
然后我使用boto3将文件上传到S3如下:
@app.route('/upload',methods = ['GET','POST'])
def upload_file():
if request.method =='POST':
file = request.files['file']
if file:
filename = secure_filename(file.filename)
#file.save(os.path.join(UPLOAD_FOLDER,filename))
s3_resource = boto3.resource('s3',aws_access_key_id='****',
aws_secret_access_key='*****')
buck = s3_resource.Bucket('MY_BUCKET_NAME')
buck.Object(file.filename).put(Body=file.read())
return 'uploaded'
文件已成功上传到 S3 存储桶中。当试图打开该文件时,它会以空白文本文件的形式打开。即使我尝试在put() 方法中设置ContentType,但仍然无法正常工作。
它的大小也显示0B
请告诉我出了什么问题?
谢谢!
【问题讨论】:
-
您是否尝试向 Python 添加调试代码以显示
file变量中的内容? -
是的,
file变量是所选文件的FileStroage,因为我正在使用Flask框架。但是s3的put()方法接受file -like object所以我使用file.read()。 -
您还在哪里使用过
file.read()?你能显示整个代码吗? -
另一种方法是将文件保存到
/tmp/目录,然后从磁盘上传文件。 flask.request.files Python Example -
@Debendra,我使用
file.read()仅在put()方法中传递Body属性。我已经更新了完整的/upload路线。