Chr*_*ris 5 django image-uploading data-url html5-canvas
我试图在Django中执行此操作(异步上传画布作为图像文件).我正在使用(稍微修改过的版本)在演示中找到的javascript,它推出了自己的XHRHttpRequest,但是我没有在服务器端找到任何上传的证据.
画布数据的提取方式如下:
img_data = canvas.toDataURL('image/jpeg').replace("data:image/jpeg;base64,", "");
Run Code Online (Sandbox Code Playgroud)
这是xhr标题:
xhr.setRequestHeader('content-type', 'multipart/form-data; boundary=multipartformboundary1352769538973');
Run Code Online (Sandbox Code Playgroud)
这是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--
Run Code Online (Sandbox Code Playgroud)
当我让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...
}>
Run Code Online (Sandbox Code Playgroud)
所以正常的POST键/值对正在通过,但基于此,我希望看到一个response.FILES字典.谁能指出我正确的方向?
事实证明,如果我刚发布canvas.toDataURL(),按上述方式修剪字符串并在服务器上执行此操作,则整个过程要容易得多:
img_data = img_string.decode("base64")
img_file = open("photo.jpg", "wb")
img_file.write(img_data)
img_file.close()
Run Code Online (Sandbox Code Playgroud)
根据肖恩的评论进行编辑
我在POST中发送的只是base64数据部分,这意味着从以下结果中删除这些前导字符toDataURL():
data:image/jpeg;base64,
Run Code Online (Sandbox Code Playgroud)
这可以在客户端或服务器端完成,要点是,在将base64字符解码为二进制并写入图像文件之前,需要删除这些内容。
小智 1
Django 不将FILES字典包含在repr()输出中。无论如何尝试访问它:
print request.FILES
Run Code Online (Sandbox Code Playgroud)
在Django 源代码中,您可以看到包含path, GET, POST, COOKIES, 和META,但不包含FILES。
| 归档时间: |
|
| 查看次数: |
3260 次 |
| 最近记录: |