Car*_*ers 9 python twisted.web
我搜索和搜索但似乎无法找到一种方法以任何合理的方式将文件上传到我的twisted.web应用程序.
目前,将文件上载发布到资源会产生一个request.args['file']
变量,即填充了文件内容的列表.我找不到获取有关该文件的任何信息的方法:mime type,filename,filesize(除了只取字符串的长度args['file'][]
)等.
我已经读过twisted.web2在文件上传方面更好.但是我不知道它有多好,或者我如何使用twisted.web2来处理twisted.web应用程序中的文件上传.
有什么建议?这就像疯了一样困扰着我 - 哦,我查看了请求标题,并没有真正找到任何有意义的东西.如何使用Twisted获取有关文件上传的更多元信息?
我怎样才能从请求对象中获取裸HTTP请求?可能吗?
这是一个古老的问题,但是快速搜索stackoverflow并没有发现类似的问题/答案,因此这里是一个twisted.web2
用于文件上传的快速示例。
隐藏的表单变量file_foo
与文件上载变量具有相同的名称,以显示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>
Run Code Online (Sandbox Code Playgroud)
在您的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.')
Run Code Online (Sandbox Code Playgroud)
输出:
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'
Run Code Online (Sandbox Code Playgroud)