Мне не удалось получить запрос, используя application/octet-stream
типа сообщений, но в прошлом использовали формы типа multipart/form-data
, чтобы загрузить изображения с помощью фляжки.
Я расширил то, что я сделал в прошлом, чтобы поддерживать несколько загружаемых файлов, и это помогло использовать объекты FileStorage
werkzeug.
Ключевым моментом здесь является создание почтового маршрута, который ищет элемент запроса из формы. Это должно позволить вам отправлять POST на маршрут либо по стандартной форме, либо по вызову AJAX.
Ниже приведен упрощенный пример, который использует форму:
Шаблон для представления:
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>jQuery File Upload Example</title>
</head>
<body>
{% if err %}
<h4>{{ err }}</h4>
{% endif %}
<form action="/" method=POST enctype=multipart/form-data id="fileupload">
<input type="file" name="files" data-url="/" multiple>
<input type=submit value=Post>
</form>
{% if files %}
{% for file in files %}
<p>Uploaded: <b>{{ file }}</b> </p>
{% endfor %}
{% endif %}
</body>
</html>
КОЛБУ App
from flask import Flask, request, render_template
from werkzeug import secure_filename, FileStorage
import os
# Flask functions
app = Flask(__name__)
app.config.from_object(__name__)
DEBUG = True
# add this so that flask doesn't swallow error messages
app.config['PROPAGATE_EXCEPTIONS'] = True
@app.route('/', methods=['GET', 'POST'])
def uploader():
if request.method =='POST' and request.files.getlist('files'):
up_file_list = []
# Iterate the through a list of files from the form input field
for a_file in request.files.getlist('files'):
if a_file.filename:
# Validate that what we have been supplied with is infact a file
if not isinstance(a_file, FileStorage):
raise TypeError("storage must be a werkzeug.FileStorage")
# Sanitise the filename
a_file_name = secure_filename(a_file.filename)
# Build target
a_file_target = os.path.join('/tmp/', a_file_name)
# Save file
a_file.save(a_file_target)
up_file_list.append(a_file_name)
# Return template
if up_file_list:
return render_template('uploader.html', err=None, files=up_file_list)
else:
return render_template('uploader.html', err='No Files Uploaded', files=None)
else:
return render_template('uploader.html', err=None, files=None)
# application execution
if __name__ == '__main__':
app.run()
Если вы на Chrome, посмотрите вкладку «Сеть» инструментов разработчика и посмотрите, как выглядят два запроса. – Blender
------ WebKitFormBoundaryxInpKfVFK8mUuqOv Content-Disposition: form-data; Name = "post_photo_gallery"; filename = "" Content-Type: строки приложения/октета-потока не отображаются в запросе AJAX – saidozcan
Это может быть полезно: https://github.com/blueimp/jQuery-File-Upload/wiki/Flask – Blender