1

create_upload_url()で作成されたURLに画像をアップロードし、デフォルトのBlobstoreUploadHandlerで処理し、画像のget_serving_url()URLを使用してJSONメッセージをクライアントに返そうとしています。私のコードは次のとおりです。

class UploadHandler(blobstore_handlers.BlobstoreUploadHandler):
    def post(self):
        response = {}

        upload_files = self.get_uploads('file')
        blob_info = upload_files[0]

        response['error'] = False
        response['message'] = "Image uploaded."
        response['image_url'] = images.get_serving_url(blob_info.key())

        self.response.headers['Content-Type'] = 'application/json'
        self.response.out.write(json.dumps(response))

app = webapp2.WSGIApplication(
    [('/_ih/upload_handler/', UploadHandler),
    ], debug=True)

問題は、クライアント側で応答が受信されないことです。AppEngineログには、リクエストのステータスが200と表示されます。フラッシュを使用してリクエストを行うと、ステータスコードは200で応答本文はありませんが、HTML5を使用すると「(キャンセル)」のステータスが出力されます。何が起こっているのかわかりません。私がインターネットで見たすべてのコードスニペットから、これは機能するはずです。助けてください!ありがとうございました。

4

2 に答える 2

2

アップロードを処理して JSON 応答を返すには、upload_handler から JSON 応答を返すハンドラーにリダイレクトする必要があります。

次に例を示します。

class FileUploadHandler(blobstore_handlers.BlobstoreUploadHandler):

    def post(self):
        blob_info = self.get_uploads()[0]       
        self.redirect(self.uri_for("successfulUpload",blob_key = blob_info.key()))


class SuccessfulUpload(BaseHandler):

    def get(self, blob_Key):
        response['error'] = False
        response['message'] = "Image uploaded."
        response['image_url'] = images.get_serving_url(blobstore.BlobKey(blob_Key))
        self.response.headers['Content-Type'] = 'application/json'
        self.response.out.write(json.dumps(response))
于 2013-02-09T07:29:18.457 に答える
2

結局のところ、これは HTML5 Cross-Origin Resource Sharing の問題でした。これは、応答に正しいヘッダーを追加することで修正できます。

class UploadHandler(blobstore_handlers.BlobstoreUploadHandler):
    def post(self):
        response = {}

        upload_files = self.get_uploads('file')
        blob_info = upload_files[0]

        response['error'] = False
        response['message'] = "Image uploaded."
        response['image_url'] = images.get_serving_url(blob_info.key())


        self.response.headers.add_header("Access-Control-Allow-Methods", "POST") 
        self.response.headers.add_header("Access-Control-Allow-Origin", "*")

        self.response.headers['Content-Type'] = 'application/json'

        self.response.out.write(json.dumps(response))
于 2013-02-18T04:15:43.657 に答える