1

アップロードされたバイナリ ファイルを処理するためのサーバー側コードがあります。

class UploadHandler(webapp.RequestHandler):
    def post(self):
        file_name = files.blobstore.create(mime_type='application/octet-stream')
        with files.open(file_name, 'a') as f:
            f.write('data')
        files.finalize(file_name)
        blob_key = files.blobstore.get_blob_key(file_name)

これは例のコードであるため、実際にはアップロードされたファイルを処理せず、新しい Blobstore エンティティを作成し、これにデータを書き込むだけです。クライアント側からは、実際にファイルをサーバーに送信するコードのこの部分があります。

    var xhr = new XMLHttpRequest();
    xhr.open("post", "/upload", true);

    xhr.setRequestHeader("Content-Type", "multipart/form-data");
    xhr.setRequestHeader("X-File-Name", file.fileName);
    xhr.setRequestHeader("X-File-Size", file.fileSize);
    xhr.setRequestHeader("X-File-Type", file.type);

    xhr.send(file);

FireBug では、ファイルがサーバーにアップロードされ、サーバー コードが想定どおりにファイルを作成することがわかります。私が理解できないのは、サーバー側のコードがアップロードされたファイルをストリームとして受信できるように、これら 2 つの部分を接続する方法です。私はフォームを使用しないので、のようなファイルを取得できませんupload_files = self.get_uploads('file')。サーバー側でファイルを取得するにはどうすればよいですか?

更新: webapp 要求ハンドラーに関する GAE ドキュメントで回答を見つけました。uploaded_file = self.request.bodyファイルストリームを取得するには、このようなものを使用する必要があります。それから私はそれf.write(uploaded_file)を保存するために使用します。それは私のために働くようです。それが良いアプローチである場合は、あなたの考えを共有してください。

4

1 に答える 1

1

次のようになります。

class UploadHandler(webapp.RequestHandler):
    def post(self):
        mime_type = self.request.headers['X-File-Type']
        name = self.request.headers['X-File-Name']
        file_name = files.blobstore.create(mime_type=mime_type,
                                           _blobinfo_uploaded_filename=name)
        with files.open(file_name, 'a') as f:
            f.write(self.request.body)
        files.finalize(file_name)
        blob_key = files.blobstore.get_blob_key(file_name)

カスタム ヘッダーと本文は、WebOb Requestオブジェクトから取得できます。HTML アップロード フォームを使用していないため、BlobStoreUploadHandler から継承する必要がないことに注意してください。

于 2011-05-03T12:55:47.877 に答える