2014-09-06 3 views
1

У меня есть объект (называемый «img») класса werkzeug.datastructures.FileStorage (этот объект представляет собой файл). Мне нужно сохранить этот файл на диске. Я могу сделать это следующим образом:Как можно проверить размер файла-объекта, не уничтожая его?

img.save(fname) 

Он отлично работает. Но прежде чем сохранить файл, мне нужно проверить его размер. Я делаю это следующим образом:

img.seek(0, os.SEEK_END) 
size = img.tell() 

Он работает также отлично. Но проблема в том, что я не могу сохранить файл после проверки его размера. Или, точнее, я получаю файл на диске, но он пуст, если раньше я проверял его размер.

Как я могу проверить размер файла без «уничтожения» его?

+0

Что делать, если вы используете os.stat или os.path.getsize (path)? – felipsmartins

+0

Если я использую 'os.stat (value) .st_size', я получаю:' TypeError: принуждение к Unicode: нужна строка или буфер, FileStorage found' – Roman

ответ

1

Вместо искать и сказать заменить:

import os 
img.flush() 
size = os.fstat(img.fileno()).st_size 
2

Вы забыли искать файл в его начале, прежде чем сохранить его, поэтому пустой файл

#seek to the end of the file to tell its size 
img.seek(0, os.SEEK_END) 
size = img.tell() 

#seek to its beginning, so you might save it entirely 
img.seek(0)  
img.save(fname) 
1

FileStorage WERKZEUG имеет в content_length свойство: http://werkzeug.pocoo.org/docs/0.10/datastructures/#werkzeug.datastructures.FileStorage.content_length

img.content_length 
+0

Однако обратите внимание, что 'Длина контента отправлена ​​в заголовке. Обычно недоступно'. Это будет полезно, только если заголовок 'content-length' правильно настроен загрузчиком. – Dirk

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