在 Flask 中上传图像并将其存储在本地文件夹中
Upload image in Flask and store it in local folder
我想上传一张图片并将其传递给 flask 中的 python 代码,以便它可以在本地存储和调用图片。从教程中我有这段代码,但是查询似乎有问题,请求总是以 'No file part':
结尾
if 'file' not in request.files:
flash('No file part')
return redirect(request.url)
如果我检查请求中有哪些数据:
print(request.data)
print(request.args)
print(request.form)
这给了我以下结果:
b''
ImmutableMultiDict([])
ImmutableMultiDict([('file', '6b6e63084d829d765f318a123f9997d6.jpg')])
这是我的 python 代码
ALLOWED_IMAGE_TYPES = set(["png", "jpg", "jpeg", "gif"])
def allowed_file(filename):
print("Check if image types is allowed")
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_IMAGE_TYPES
@app.route("/crop", methods=["GET", "POST"])
@login_required
def crop():
if request.method == "POST":
if 'file' not in request.files:
flash('No file part')
return redirect(request.url)
file = request.files['file']
if file.filename == '':
flash('No image selected for uploading')
return redirect(request.url)
if file and allowed_file(file.filename):
print("test2")
filename = secure_filename(file.filename)
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
print('upload_image filename: ' + filename)
flash('Image successfully uploaded and displayed below')
return render_template('index.html', filename=filename)
else:
flash('Allowed image types are - png, jpg, jpeg, gif')
return redirect(request.url)
else:
return render_template("crop.html")
@app.route('/display/<filename>')
def display_image(filename):
print('display_image filename: ' + filename)
return redirect(url_for('static', filename='uploads/' + filename), code=301)
<div class="container">
<div class="row">
<p>
{% with messages = get_flashed_messages() %}
{% if messages %}
<ul>
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
</p>
{% if filename %}
<div>
<img src="{{ url_for('display_image', filename=filename) }}">
</div>
{% endif %}
<form method="POST" action="/crop" enctype="multipart/form-data">
<dl>
<p>
<input type="file" name="file" value="file" id="file" class="form-control" autocomplete="off" required>
</p>
</dl>
<p>
<input type="submit" value="Submit" class="btn btn-info">
</p>
</form>
request.files
是一个 dict 对象,因此检查名称是否在其中应该有效。出于某种原因,它不是,所以你可以尝试检查它是否在 keys()
中,尽管这应该是不必要的。
if 'file' not in request.files.keys():
flash('No file part')
return redirect(request.url)
发现HTML代码中的问题,大括号两边的引号是错误的。
<img src={{ url_for('display_image', filename=filename) }}>
我想上传一张图片并将其传递给 flask 中的 python 代码,以便它可以在本地存储和调用图片。从教程中我有这段代码,但是查询似乎有问题,请求总是以 'No file part':
结尾if 'file' not in request.files:
flash('No file part')
return redirect(request.url)
如果我检查请求中有哪些数据:
print(request.data)
print(request.args)
print(request.form)
这给了我以下结果:
b''
ImmutableMultiDict([])
ImmutableMultiDict([('file', '6b6e63084d829d765f318a123f9997d6.jpg')])
这是我的 python 代码
ALLOWED_IMAGE_TYPES = set(["png", "jpg", "jpeg", "gif"])
def allowed_file(filename):
print("Check if image types is allowed")
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_IMAGE_TYPES
@app.route("/crop", methods=["GET", "POST"])
@login_required
def crop():
if request.method == "POST":
if 'file' not in request.files:
flash('No file part')
return redirect(request.url)
file = request.files['file']
if file.filename == '':
flash('No image selected for uploading')
return redirect(request.url)
if file and allowed_file(file.filename):
print("test2")
filename = secure_filename(file.filename)
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
print('upload_image filename: ' + filename)
flash('Image successfully uploaded and displayed below')
return render_template('index.html', filename=filename)
else:
flash('Allowed image types are - png, jpg, jpeg, gif')
return redirect(request.url)
else:
return render_template("crop.html")
@app.route('/display/<filename>')
def display_image(filename):
print('display_image filename: ' + filename)
return redirect(url_for('static', filename='uploads/' + filename), code=301)
<div class="container">
<div class="row">
<p>
{% with messages = get_flashed_messages() %}
{% if messages %}
<ul>
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
</p>
{% if filename %}
<div>
<img src="{{ url_for('display_image', filename=filename) }}">
</div>
{% endif %}
<form method="POST" action="/crop" enctype="multipart/form-data">
<dl>
<p>
<input type="file" name="file" value="file" id="file" class="form-control" autocomplete="off" required>
</p>
</dl>
<p>
<input type="submit" value="Submit" class="btn btn-info">
</p>
</form>
request.files
是一个 dict 对象,因此检查名称是否在其中应该有效。出于某种原因,它不是,所以你可以尝试检查它是否在 keys()
中,尽管这应该是不必要的。
if 'file' not in request.files.keys():
flash('No file part')
return redirect(request.url)
发现HTML代码中的问题,大括号两边的引号是错误的。
<img src={{ url_for('display_image', filename=filename) }}>