8

Flask サーバーをセットアップするときに、ユーザーがアップロードしたファイルの受信を試みることができます。

imagefile = flask.request.files['imagefile']
filename_ = str(datetime.datetime.now()).replace(' ', '_') + \
    werkzeug.secure_filename(imagefile.filename)
filename = os.path.join(UPLOAD_FOLDER, filename_)
imagefile.save(filename)
logging.info('Saving to %s.', filename)
image = exifutil.open_oriented_im(filename)

Kleinドキュメントを見てhttp://klein.readthedocs.io/en/latest/examples/staticfiles.htmlいると が表示されていますが、これは、Web サービスにアップロードされたファイルを受け取るのではなく、Web サービスからファイルを提供しているように見えます。Kleinサーバーが を受信して​​ファイル システムに保存できるようにしたい場合abc.jpg、その目的を達成するためのガイドとなるドキュメントはありますか?

4

1 に答える 1

3

コメントされているように、この投稿Liam Kellyのスニペットは機能するはずです。を使用すると、ファイル メタデータを明示的に送信しなくても簡単に送信できます。Klein/Twisted アプローチは次のようになります。cgi.FieldStorage

from cgi import FieldStorage
from klein import Klein
from werkzeug import secure_filename

app = Klein()

@app.route('/')
def formpage(request):
    return '''
    <form action="/images" enctype="multipart/form-data" method="post">
    <p>
        Please specify a file, or a set of files:<br>
        <input type="file" name="datafile" size="40">
    </p>
    <div>
        <input type="submit" value="Send">
    </div>
    </form>
    '''

@app.route('/images', methods=['POST'])
def processImages(request):
    method = request.method.decode('utf-8').upper()
    content_type = request.getHeader('content-type')

    img = FieldStorage(
        fp = request.content,
        headers = request.getAllHeaders(),
        environ = {'REQUEST_METHOD': method, 'CONTENT_TYPE': content_type})
    name = secure_filename(img[b'datafile'].filename)

    with open(name, 'wb') as fileOutput:
        # fileOutput.write(img['datafile'].value)
        fileOutput.write(request.args[b'datafile'][0])

app.run('localhost', 8000)

何らかの理由で、私の Python 3.4 (Ubuntu 14.04) バージョンはcgi.FieldStorage正しい結果を返しません。これを Python 2.7.11 でテストしたところ、問題なく動作しました。そうは言っても、フロントエンドでファイル名やその他のメタデータを収集し、それらを ajax 呼び出しで klein に送信することもできます。こうすれば、バックエンドであまり多くの処理を行う必要がなくなります (これは通常は良いことです)。または、werkzeug が提供するユーティリティの使用方法を理解することもできます。関数werkzeug.secure_filenameおよびrequest.files(つまりFileStorage) の実装または再作成は特に難しくありません。

于 2016-09-11T17:13:56.037 に答える