代码之家  ›  专栏  ›  技术社区  ›  Carson Myers

我怎样才能在twisted.web中完成文件上传呢?

  •  9
  • Carson Myers  · 技术社区  · 14 年前

    当前,将文件上载到资源会导致 request.args['file'] args['file'][] )等等。

    我读到twisted.web2更擅长文件上传。但是我不知道 多少钱? 更好的是,或者我将如何使用twisted.web2来处理twisted.web应用程序中的文件上传。

    有什么建议吗?这让我非常恼火——哦,我看了一下请求头,没有发现任何有意义的东西。如何使用Twisted获得更多关于文件上传的元信息?

    也,

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

    2 回复  |  直到 14 年前
        1
  •  5
  •   samplebias    14 年前

    这是一个老问题,但是快速搜索stackoverflow并没有找到可比较的问题/答案,因此下面是一个使用 twisted.web2 用于文件上载。

    file_foo 与一个 file upload变量,以显示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'
    
        2
  •  3
  •   Community CDub    8 年前

    solution for upload . 该解决方案使用cgi.FieldStorage来解析有效负载。

    为了分析你需要的 request.content request[args] 如您所见,结果与web2中的结果几乎相同 request.files .