如何在twisted.web中完成不吮吸的文件上传?

时间:2010-07-17 10:46:01

标签: python twisted.web

我进行了搜索和搜索,但似乎找不到以合理的方式将文件上传到twisted.web应用程序的方法。

目前,将文件上传到资源会产生request.args['file']变量,即填充了文件内容的列表。我找不到获取文件信息的方法:mime type,filename,filesize(除了只考虑args['file'][]中字符串的长度)等。

我已经读过twisted.web2在文件上传方面更好。但是我不知道它有多少,或者我如何使用twisted.web2来处理twisted.web应用程序中的文件上传。

有什么建议吗?这就像疯了一样困扰着我 - 哦,我查看了请求标题,并没有真正找到任何有意义的东西。如何使用Twisted获取有关文件上传的更多元信息?

此外,

如何从请求对象中获取裸HTTP请求?有可能吗?

2 个答案:

答案 0 :(得分:4)

这是一个老问题,但是对stackoverflow的快速搜索没有提出类似的问题/答案,所以这里有一个使用twisted.web2进行文件上传的快速示例。

隐藏的表单变量file_foo与a共享同一个名称 文件上传变量,以显示Twisted将如何拆分这些:

<form action="/upload?a=1&b=2&b=3" enctype="multipart/form-data"
        method="post">
    <input type="hidden" name="foo" value="bar">
    <input type="hidden" name="file_foo" value="not a file">
    file_foo: <input type="file" name="file_foo"><br/>
    file_foo: <input type="file" name="file_foo"><br/>
    file_bar: <input type="file" name="file_bar"><br/>
    <input type="submit" value="submit">
</form>

Resource.render()方法中,您可以通过以下方式访问该表单 变量:

def render(self, ctx):
    request = iweb.IRequest(ctx)
    for key, vals in request.args.iteritems():
        for val in vals:
            print key, val

    print 'file uploads ----------------'
    for key, records in request.files.iteritems():
        print key
        for record in records:
            name, mime, stream = record
            data = stream.read()
            print '   %s %s %s %r' % (name, mime, stream, data)

    return http.Response(stream='upload complete.')

输出:

         a: 1
         b: 2 3
       foo: bar
  file_foo: not a file

file_bar
   bar.txt MimeType('text', 'plain', {}) <open file '<fdopen>', mode 'w+b' at 0x2158a50> 'bar data.\n\n'
file_foo
   foo.txt MimeType('text', 'plain', {}) <open file '<fdopen>', mode 'w+b' at 0x2158930> 'foo data.\n\n'
   foo.txt MimeType('text', 'plain', {}) <open file '<fdopen>', mode 'w+b' at 0x21589c0> 'foo data.\n\n'

答案 1 :(得分:3)

我这样做就像在这里描述的那样:solution for upload。 该解决方案使用cgi.FieldStorage来解析有效负载。

此外: 出于解析的目的,您需要request.content而不是request[args]。 如您所见,结果几乎与web2 request.files中的结果相同。