我正在设置一个flask应用程序,用户可以在其中上传存储在aws s3存储桶中的个人资料图像。使用boto3,我可以将文件上传到s3。但是上传后,我得到的文件大小为0。
我尝试了在0-bytes-file,put-method-loads-0和github中找到的所有答案,但无法正常工作。以下是我的代码。
route.py
@users.route('/edit_profile', methods=['GET', 'POST'])
def edit_profile():
form = EditProfileForm()
if form.validate_on_submit():
file = request.files['user_image']
if file:
file.filename = secure_filename(file.filename)
url = upload_file_s3(file)
current_user.profile_image_url = url
database.update(current_user._get_current_object())
flash('Your Profile has been updated!', 'success')
return redirect(url_for('users.edit_profile'))
return render_template('users/edit_profile.html', form=form)
helper.py
def upload_file_s3(file, acl="public-read"):
app = current_app._get_current_object()
s3 = boto3.client('s3', aws_access_key_id='xxxx',
aws_secret_access_key='yyyy'
bucket_name = 'zzzz'
s3.upload_fileobj(
file,
bucket_name,
file.filename,
ExtraArgs={
"ACL": acl,
"ContentType": file.content_type
}
)
return "{}{}".format(app.config["S3_LOCATION"], file.filename)
update.html
<form method="POST" action="" enctype="multipart/form-data">
<input id="csrf_token" name="csrf_token" type="hidden" value="ImE2NzV">
<div class="form-group">
<label for="user_image">Add Profile Picture</label>
<input class="form-control-file" id="user_image" name="user_image" type="file">
</div>
<div class="form-group mt-4">
<input class="btn" id="submit" name="submit" type="submit" value="Update Profile">
</div>
</form>
但是,我能够通过cli上传文件。
s3 = boto3.client('s3',aws_access_key_id='xxxx', aws_secret_access_key='yyyy' )
bucketname = 'zzzz'
filename = 'dog.jpg'
s3.upload_file(filename, bucket_name, filename)
由于我能够通过cli上传文件,所以flask / python代码一定存在问题。