2013-08-15 3 views
2

В Колба (установлен Колба-0.10.1 через пип) Я пытался справиться с загруженными файлами, как этотPython - Какой тип flask.request.files.stream должен быть?

f = flask.request.files[input_name] 
stream = f.stream 
# then use the stream 

Но это заблуждение, что в некоторых случаях stream является BytesIO экземпляр, но и шанс быть a file объект.

Я протестировал таким образом

from flask import Flask, request 
import cStringIO 

app = Flask('test') 

@app.route("/", methods=['POST']) 
def index(): 
    if request.method == 'POST': 
     f = request.files['file'] 
     print type(f.stream) 

def send_file(client, name): 
    with open(name, 'rb') as f: 
     client.post('/', data={'file': (cStringIO.StringIO(f.read()), name)}) 

if __name__ == "__main__": 
    with app.test_client() as client: 
     send_file(client, 'homercat.png') 
     send_file(client, 'megacat-2.png') 

Он печатает

<type '_io.BytesIO'> 
<type 'file'> 

Файлы PNG взяты из GitHub:

http://octodex.github.com/images/homercat.png http://octodex.github.com/images/megacat-2.png

Интересно, почему колба ведет себя таким образом. И если я хочу, чтобы загруженные данные попали в базу данных, можно ли в любом случае позвонить f.stream.read()?

ответ

6

Файлы размером менее 1024 * 500 байт записываются в объект StringIO, а файлы, превышающие этот порог, записываются во временные файлы.

Это часть основы тестирования WERKZEUG, но эта функция не является частью онлайновой документации:

def stream_encode_multipart(values, use_tempfile=True, threshold=1024 * 500, 
          boundary=None, charset='utf-8'): 
    """Encode a dict of values (either strings or file descriptors or 
    :class:`FileStorage` objects.) into a multipart encoded string stored 
    in a file descriptor. 
    """ 

    ... 

Source

+0

Я узнал его с этой сутью https://gist.github.com/ lost-theory/3772472, и он вызывает исключение, когда я заменяю элементы в кортеже. – neuront

+0

@neuront: Смотрите мое обновление. – Blender

Смежные вопросы