Web2Py - загрузить файл и прочитать содержимое в виде файла Zip - PullRequest
0 голосов
/ 20 июня 2011

Я пытаюсь загрузить zip-файл из формы Web2Py и затем прочитать содержимое:

form = FORM(TABLE(
           TR(TD('Upload File:', INPUT(_type='file', 
                                       _name='myfile', 
                                       id='myfile', 
                                       requires=IS_NOT_EMPTY()))), 
           TR(TD(INPUT(_type='submit',_value='Submit')))
       ))

if form.accepts(request.vars):  
    data=StringIO.StringIO(request.vars.myfile)  
    import zipfile  
    zfile=zipfile.Zipfile(data)

По какой-то причине этот код работает и жалуется на то, что файл не является zip-файлом, хотя загруженный файлпочтовый файл.

Я новичок в Web2Py.Как data можно представить в виде zip-файла?

Ответы [ 2 ]

6 голосов
/ 15 сентября 2011

Загрузка полей формы web2py уже является cgi.FieldStorage, вы можете получить необработанные загруженные байты, используя:

data = request.vars.myfile.value

Для объектоподобного объекта StringIO не требуется, используйте:

filelike = request.vars.myfile.file
zip = zipfile.Zipfile(filelike)
3 голосов
/ 20 июня 2011

HTTP-загрузки - это не просто двоичный файл, это кодирование в смешанной форме.Запишите request.vars.myfile на диск, и вы увидите, что он скажет что-то вроде

------------------BlahBlahBoundary
Content-Disposition: type="file"; name="myfile"
Content-Type: application/octet-stream

<binary data>
------------------BlahBlahBoundary--

Наивное решение для этого - использовать cgi.FieldStorage (), в примере, который я предоставляю, используется wsgi.input, который является частью mod_wsgi.

form = cgi.FieldStorage(fp=environ['wsgi.input'], environ=environ)
raw_filw = cStringIO.StringIO(form['myfile'].file.read())

Здесь нужно отметить две вещи

  • Всегда используйте cStringIO, если он у вас есть, это будет быстрее, чемStringIO

  • Если вы разрешите загрузку таким образом, вы передадите файл в оперативную память, поэтому, как бы велик ни был файл, это то, сколько оперативной памяти вы будете использовать - это НЕ масштабируется,Мне пришлось написать свой собственный анализатор потока MIME для потоковой передачи файлов на диск через python, чтобы избежать этого.Но если вы учитесь или это доказательство концепции, у вас все будет хорошо.

...