2013-04-12 2 views
7

Я хочу сделать несколько файлов для загрузки файлов. Я использую jQuery File Uploader. Мой код на стороне сервера:Колба: Как обрабатывать приложение/октет-поток

@app.route("/new/photogallery",methods=["POST"]) 
def newPhotoGallery(): 
    print request.files 

Я попробовал две вещи:

  1. оставившие формы обычно:

    Когда я представить свою форму, как правило, она печатает:

    ImmutableMultiDict([('post_photo_gallery', FileStorage: u'' ('application/octet-stream'))])

  2. Отправить форму, используя AJAX:

    Когда я представить свою форму с помощью AJAX, она печатает:

    ImmutableMultiDict([])

Мой первый вопрос: Почему существует разница между запроса AJAX и обычный запрос.
Мой второй вопрос: как я могу обработать этот запрос application/octet-stream в Flask/Python Мой третий вопрос: это хороший способ использовать application/octet-stream?

Кстати, я не знаю много о application/octet-stream. Большое вам спасибо.

+0

Если вы на Chrome, посмотрите вкладку «Сеть» инструментов разработчика и посмотрите, как выглядят два запроса. – Blender

+0

------ WebKitFormBoundaryxInpKfVFK8mUuqOv Content-Disposition: form-data; Name = "post_photo_gallery"; filename = "" Content-Type: строки приложения/октета-потока не отображаются в запросе AJAX – saidozcan

+0

Это может быть полезно: https://github.com/blueimp/jQuery-File-Upload/wiki/Flask – Blender

ответ

2

Мне не удалось получить запрос, используя 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() 
Смежные вопросы