使用 Flask 上传到 S3 时出现 FileNotFoundError
FileNotFoundError When uploading to S3 using Flask
我正在尝试将文件上传到 amazon s3,但我一直收到 FileNotFoundError: [Errno 2] No such file or directory: -filename-
错误,
init.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)
config.py
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)
home.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。
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
或者,您可以使用 upload_fileobj 并传递文件对象,而且它不需要 file.save()
.
file = request.files['file']
filename = secure_filename(file.filename)
s3.upload_fileobj(Bucket=S3_BUCKET, Fileobj=file, Key=filename) # Fileobj instead of Filename
我正在尝试将文件上传到 amazon s3,但我一直收到 FileNotFoundError: [Errno 2] No such file or directory: -filename-
错误,
init.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)
config.py
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)
home.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。
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
或者,您可以使用 upload_fileobj 并传递文件对象,而且它不需要 file.save()
.
file = request.files['file']
filename = secure_filename(file.filename)
s3.upload_fileobj(Bucket=S3_BUCKET, Fileobj=file, Key=filename) # Fileobj instead of Filename