0

Web2Py フォームから zip ファイルをアップロードして、内容を読み取ろうとしています。

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 ファイルですが、ファイルが zip ファイルではないことを訴えます。

私は初めてWeb2Pyです。datazip ファイルとしてどのように表現できますか?

4

2 に答える 2

6

web2py フォーム フィールドのアップロードはすでに cgi.FieldStorage になっています。

data = request.vars.myfile.value

ファイルのようなオブジェクト StringIO が不要な場合は、次を使用します。

filelike = request.vars.myfile.file
zip = zipfile.Zipfile(filelike)
于 2011-09-15T01:33:36.270 に答える
3

HTTPアップロードは、生のバイナリだけでなく、混合マルチパート形式でエンコードされています。request.vars.myfileをディスクに書き出すと、次のように表示されます。

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

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

これに対する素朴な解決策は、cgi.FieldStorage()を使用することです。私が提供する例では、mod_wsgiの一部であるwsgi.inputを使用しています。

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

ここで指摘すべき2つのこと

  • 持っている場合は常にcStringIOを使用してください。StringIOよりも高速です。

  • このようなアップロードを許可すると、ファイルをRAMにストリーミングすることになります。したがって、ファイルの大きさは、使用するRAMの量になります。これはスケーリングされません。これを回避するには、Pythonを介してファイルをディスクにストリーミングする独自のカスタムMIMEストリームパーサーを作成する必要がありました。ただし、学習している場合、またはこれが概念実証である場合は、問題ないはずです。

于 2011-06-20T07:01:31.697 に答える