首页 > 解决方案 > 使用 Flask 上传到 S3 时出现 FileNotFoundError

问题描述

我正在尝试将文件上传到 amazon s3,但我不断收到FileNotFoundError: [Errno 2] No such file or directory: -filename-错误,

初始化.py

from flask import Flask, render_template, request, redirect
from werkzeug.utils import secure_filename

app = Flask(__name__)

import boto3, botocore
from .config import S3_KEY, S3_SECRET, S3_BUCKET

s3 = boto3.client(
   "s3",
   aws_access_key_id=S3_KEY,
   aws_secret_access_key=S3_SECRET
)

@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        file = request.files['file']
        filename = ""
        if file:
            filename = secure_filename(file.filename)

        s3.upload_file(Bucket=S3_BUCKET, Filename=filename, Key=filename)
        return redirect(url_for('home.html'))
    return render_template('home.html')

if __name__ == '__main__':
    app.run(debug=True)

配置文件

import os

S3_BUCKET                 = os.environ.get("S3_BUCKET")
S3_KEY                    = os.environ.get("S3_KEY")
S3_SECRET                 = os.environ.get("S3_SECRET_ACCESS_KEY")

SECRET_KEY                = os.environ.get('SECRET_KEY')
S3_LOCATION               = 'http://{}.s3-ap-southeast-1.amazonaws.com/'.format(S3_BUCKET)

主页.html

{% extends "layout.html" %}
{% block content %}
<div>
    <form method='post' enctype='multipart/form-data'>
        <div class='form-group'>
            <label for='file'> Upload </label>
            <input type='file' id='file' name='file'>
        </div>
        <div class='form-group'>
            <button type='submit' class='btn btn-primary'> Submit </button>
        </div>
    </form>
</div>
{% endblock %}

我还安装并配置了 aws cli。

标签: flaskamazon-s3boto3file-not-found

解决方案


FileNotFoundError 是由于文件不存在。upload() 中的代码实际上并没有保存上传的文件,它只是为其获取一个安全的名称并立即尝试打开它——但失败了。

获取安全文件名后,尝试使用 save() 将文件保存到文件系统:

upload_file = request.files['file']
filename = secure_filename(upload_file.filename)
upload_file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))

然后上传它(假设您已经配置了一个 UPLOAD_FOLDER):

open(os.path.join(app.config['UPLOAD_FOLDER'], filename), 'rb') as f

推荐阅读