2015-05-14 5 views
1

Мне нужно получить двоичный файл из wtforms и сохранить его как bytea в postgresql. И мне не нужно постоянно хранить его в виде файла. Из моего понимания Flask offical doc я получаю доступ к имени файла через файл request.files. ['Myfile']. Filename или secure_filename (f.filename). Тем не менее, оба они дают мне ошибку: IOError: [Errno 2] Нет такого файла или каталога: u'myuploadpdf.pdf»Не удается прочитать файл из secure_filename (f.filename)

   f = request.files.['myfile']: 
       if f and allowed_file(f.filename): 
       #filename = secure_filename(f.filename) 
       data = open(f.filename, 'rb').read() 
       #data = open(filename , 'rb').read() 
       binary = psycopg2.Binary(data) 

ответ

3

open() ожидает полный путь к файлу. Поскольку файл не был сохранен на диске, такой путь не существует. :)

Что вы на самом деле хотите сделать, это позвонить по телефону f.read() напрямую. Чтение входящих файлов покрыто here.

Кроме того, обязательно используйте secure_filename(), если вы работаете с чем-либо на диске. Не хотите открывать себя для любой атаки обхода каталога по линии.

+0

Файл будет сохранен в базе данных. Итак, вы говорите, что я должен хранить его на диске перед сохранением в базе данных, поскольку request.files ['myfile']. Read() не защищен. –

+0

Нет, вы можете преобразовать его, а затем сохранить непосредственно в Postgres, как вы делали с помощью 'psycopg2.Binary (data)' и оператора ORM/insert по вашему выбору. Мой комментарий о 'secure_filename' применим только при сохранении на диске или чтении с диска. В отношении безопасности при обработке загружаемого пользователем контента это означало больше. 'FileStorage.read' по своей сути небезопасен, если вы не доверяете его контенту. ;) –

+0

Спасибо, но мне все еще нужно прочитать файл в двоичном режиме: data = open (fn, 'rb'). Read(), чтобы вызвать psycopg2.Binary (data), что приводит меня к [этому вопросу] (http://stackoverflow.com/questions/30245395/typeerror-cant-escape-psycopg2-extensions-binary-to-binary) –

2

Объекты в request.files не являются объектами FileStorage и они имеют одни и те же методы как обычные файловые объекты в python. Таким образом, чтобы получить содержимое файла в двоичном виде, попробуйте сделать следующее:

data = request.files['myfile'].read() 
Смежные вопросы