Как решить проблему с загрузкой файлов в aws s3 через boto3? - PullRequest
0 голосов
/ 05 апреля 2019

Я настраиваю приложение фляги, где пользователь может загрузить изображение профиля, которое хранится в корзине aws s3.Используя boto3, я могу загрузить файл на s3.Но после загрузки я получаю размер файла равным 0.

Я перепробовал все ответы, найденные в 0-байтовом файле , put-method-load-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 должно быть что-то не так.

...