5

私はこれをDjangoで行おうとしています(キャンバスを画像ファイルとして非同期アップロードします)。デモで見つかったjavascript(のわずかに変更されたバージョン)を使用しています。これは独自のXHRHttpRequestをロールしますが、サーバー側でアップロードの証拠を見つけることができません。

キャンバスデータは次のように抽出されます。

img_data = canvas.toDataURL('image/jpeg').replace("data:image/jpeg;base64,", "");

これはxhrヘッダーです:

xhr.setRequestHeader('content-type', 'multipart/form-data; boundary=multipartformboundary1352769538973');

これはPOSTコンテンツです。

--multipartformboundary1352769538973
Content-Disposition: form-data; name="user_file"; filename="test.jpeg"
Content-Type: application/octet-stream

/9j/4AAQSkZJRgABAgAAAQABAAD/2wCEAAUDAwUHD...snipping image data...
AJRRRQAUtJS018gA/9k=
--multipartformboundary1352769538973
Content-Disposition: form-data; name="username"


--multipartformboundary1352769538973
Content-Disposition: form-data; name="challenge"


--multipartformboundary1352769538973
Content-Disposition: form-data; name="galleryPath"


--multipartformboundary1352769538973--

Djangoに、表示されるリクエストオブジェクトを表示するように依頼すると、次のようになります。

<WSGIRequest
path:/samlite/save_frame,
GET:<QueryDict: {}>,
POST:<QueryDict: {u'username': [u''], u'challenge': [u''], u'galleryPath': [u'']}>,
COOKIES:{},
META:{'ARCHFLAGS': '-arch i386',
 'Apple_PubSub_Socket_Render': '/tmp/launch-wL0OpX/Render',
 'Apple_Ubiquity_Message': '/tmp/launch-ox20mG/Apple_Ubiquity_Message',
 'COMMAND_MODE': 'unix2003',
 'CONTENT_LENGTH': '34323',
 'CONTENT_TYPE': 'multipart/form-data; boundary=multipartformboundary1352769538973',
 'DISPLAY': '/tmp/launch-KzsfWx/org.x:0',
 'DJANGO_SETTINGS_MODULE': 'simsam.settings',
 'DYLD_LIBRARY_PATH': '/Applications/bitnami-djangostack/apps/django/lib/python2.7/site-packages:/Applications/bitnami-djangostack/apps/django/lib/python2.7/site-packages:/Applications/bitnami-djangostack/python/lib:/Applications/bitnami-djangostack/mysql/lib:/Applications/bitnami-djangostack/sqlite/lib:/Applications/bitnami-djangostack/apache2/lib:/Applications/bitnami-djangostack/common/lib:',
 'GATEWAY_INTERFACE': 'CGI/1.1',
 'HOME': '/Users/chris',
 'HTTP_ACCEPT': 'text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1',
 'HTTP_ACCEPT_ENCODING': 'gzip, deflate',
 'HTTP_ACCEPT_LANGUAGE': 'en,en-US;q=0.9,ja;q=0.8,fr;q=0.7,de;q=0.6,es;q=0.5,it;q=0.4,pt;q=0.3,pt-PT;q=0.2,nl;q=0.1',
 'HTTP_CONNECTION': 'Keep-Alive',
 'HTTP_HOST': 'localhost:8000',
 'HTTP_REFERER': 'http://localhost:8000/samlite/',
 'HTTP_USER_AGENT': 'Opera/9.80 (Macintosh; Intel Mac OS X 10.7.5) Presto/2.12.388 Version/12.10',
 'LANG': 'en_US.UTF-8',
 ...less interesting stuff snipped...
}>

したがって、通常のPOSTキーと値のペアは通過していますが、これに基づいて、response.FILESディクショナリが表示されると予想しました。誰かが私を正しい方向に向けることができますか?

4

2 に答える 2

5

canvas.toDataURL()POSTを実行し、上記のように文字列をトリミングして、サーバーでこれを実行した場合、全体が非常に簡単であることがわかりました。

img_data = img_string.decode("base64")
img_file = open("photo.jpg", "wb")
img_file.write(img_data)
img_file.close()

ショーンのコメントごとに編集

POSTで送信したのは、base64データ部分だけでした。つまり、これらの先頭の文字を次の結果から削除しますtoDataURL()

data:image/jpeg;base64,

これはクライアント側またはサーバー側で行うことができます。重要なのは、base64文字をバイナリにデコードしてイメージファイルを書き込む前に、それらを削除する必要があるということです。

于 2012-11-14T12:40:41.787 に答える
1

Djangoは出力にFILES辞書を含めません。repr()とにかくそれにアクセスしてみてください:

print request.FILES

Djangoソースでは、、、、、、が含まれていることがわかりますが、pathは含まれていません。GETPOSTCOOKIESMETAFILES

于 2012-11-13T02:25:12.183 に答える