1

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

この件に関して私が見つけることができる他のほとんどすべては、プロパティを持つと思われるIRequestオブジェクトを使用することを指していますが、ドキュメントには記載されておらず、実行するとエラーがスローされます。IRequest.files

ファイルを受け取った後の最終目標は、ファイルを特定のフォルダーに移動してから、さらにコードを実行することです。

4

1 に答える 1

1

同様の問題がありました。実際、あなたは質問の下のコメントでそれを解決しましたが、明確にして要約するために、この回答を書いています。

ファイルをアップロードするには、次のようにフォームのenctypemultipart/form-dataに設定する必要があります。

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

request.args['file'] で raw ファイルのデータにアクセスできるようになりました。元の名前を取得するには、 request.contentを解析する必要があります。

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

ただし、これらの引数 ( namefilename ) が常にこの特定の順序になるかどうかはわかりませんので、注意してください。また、複数のファイル入力がある場合は機能しないことに注意してください。

于 2013-08-20T09:34:12.920 に答える