【问题标题】:Can't get uploaded file in Twisted无法在 Twisted 中上传文件
【发布时间】:2013-06-27 18:34:17
【问题描述】:

我正在尝试运行一个简单的服务,该服务将通过 HTTP POST 接受文件上传,但是我在确定发布请求完成后实际文件数据所在的位置时遇到了一些麻烦。

到目前为止我的代码是:

from twisted.web.server import Site
from twisted.web.resource import Resource
from twisted.internet import reactor

#import cgi

class FormPage(Resource):
    def render_GET(self, request):
        return """
<html>
<body>
<form method="POST">
    Text: <input name="text1" type="text" /><br />
    File: <input name="file1" type="file" /><br />
    <input type="submit" />
</form>
</body>
</html>
"""

    def render_POST(self, request):
        response = '<p>File: %s</p>' % request.args['file1'][0]
        response += '<p>Content: %s</p>' % request.content.read()
        return '<html><body>You submitted: %s</body></html>' % (response)

root = Resource()
root.putChild("form", FormPage())
factory = Site(root)
reactor.listenTCP(8080, factory)
reactor.run()

我得到的回应是:

您提交了:

文件:test.txt

内容:text1=sdfsd&file1=test.txt

我能在该主题上找到的大多数everything else 指的是使用IRequest 对象,据说 具有IRequest.files 属性,但它没有在documentation 中列出,并且它运行时抛出错误。

收到文件后的最终目标是将其移动到特定文件夹,然后运行一些进一步的代码。

【问题讨论】:

  • 只是一个简短的说明,因为我目前没有时间提供完整的答案:您链接到的其他问题是针对 twisted.web2,现在删除了对 twisted.web 的部分重写。文件上传在 Twisted 中确实很糟糕,正如您从我们最古老的票之一中看到的那样:twistedmatrix.com/trac/ticket/288 并且文档也存在严重问题:twistedmatrix.com/trac/ticket/6181 抱歉,您遇到了困难!
  • @Glyph 原来我的表单 HTML 中缺少多部分 enctype。我有 data,但现在我发现文件名不再在帖子数据中。它永远消失了吗?
  • 我相信是的。对不起。网络浏览器也不是很好:)。
  • @Glyph 这不是浏览器,我可以在原始 POST 数据中看到文件名。 twisted.web 对它没有任何作用。

标签: python upload twisted twisted.web


【解决方案1】:

我有类似的问题。事实上,您在问题下的 cmets 中解决了这个问题,但为了澄清和总结,我正在写这个答案。

为了上传文件,您需要将表单的 enctype 设置为 multipart/form-data,如下所示:

<form enctype="multipart/form-data">
    <input type="file" name="file">
    <input type="submit" name="submit" value="Submit">
</form>

现在您可以通过 request.args['file'] 访问原始文件的数据。要获取原始名称,您需要解析 request.content,即:

import re
filename = re.search(r'name="file"; filename="(.*)"', content).group(1)

我不确定这些参数(namefilename)是否总是按照这个特定的顺序排列,所以要小心。另外请记住,如果您有 多个 文件输入,它将不起作用。

【讨论】:

  • 我实际上已经用其他一些修复程序捏造了这个,seen here
  • 调用re.search(r'name="file"; filename="(.*)"', content)解析器有点牵强 :(
猜你喜欢
  • 2018-09-29
  • 2018-12-10
  • 2014-09-09
  • 2016-02-17
  • 2017-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多