应用程序引擎Blobstore-从Android上传文件

应用程序引擎Blobstore-从Android上传文件,android,python,google-app-engine,http-post,webapp2,Android,Python,Google App Engine,Http Post,Webapp2,我有一个应用程序引擎应用程序,它使用blobstore存储用户的个人资料图片。当我从Chrome中的表单上传图像时,效果很好。当我尝试从Android应用程序上传图像时,它失败了。相反,使用android应用程序上传到我的开发服务器也不起作用 我的应用程序引擎服务器遵循上的指南。我的android上传代码基于ApacheHttpCore和来自的HttpTime 这是来自Chrome的成功请求: self.request.params: UnicodeMultiDict([(u'usersid',

我有一个应用程序引擎应用程序,它使用blobstore存储用户的个人资料图片。当我从Chrome中的表单上传图像时,效果很好。当我尝试从Android应用程序上传图像时,它失败了。相反,使用android应用程序上传到我的开发服务器也不起作用

我的应用程序引擎服务器遵循上的指南。我的android上传代码基于ApacheHttpCore和来自的HttpTime

这是来自Chrome的成功请求:

self.request.params:

UnicodeMultiDict([(u'usersid', u'xxxxx'), (u'profilePicUpload', FieldStorage(u'profilePicUpload', u'image.png'))])
UnicodeMultiDict([(u'usersid', u'xxxxx'), (u'profilePicUpload', FieldStorage(u'profilePicUpload', u'image.jpg'))])
self.request.headers:

{'Origin': 'https://site.appspot.com', 'Accept-Language': 'en-GB,en-US;q=0.8,en;q=0.6',
'X-Appengine-Blobchunksize': '9521', 'X-Requested-With': 'XMLHttpRequest',
'X-Appengine-Blobupload': 'true', 'Accept': '*/*', 'User-Agent': 'Mozilla/5.0 (X11;
Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.132 Safari/537.36',
'Host': 'site.appspot.com', 'Cookie': 'xxxxx', 'Content_Type': 'multipart/form-data;
boundary=001a11333c426e860104f972b1fc', 'Referer': 'https://site.appspot.com/profile',
'Content-Type': 'multipart/form-data; boundary=001a11333c426e860104f972b1fc',
'X-Appengine-Country': 'ZZ', 'X-Appengine-Blobsize': '9521'}
{'Content_Length': '2103726', 'User-Agent': 'Apache-HttpClient/UNAVAILABLE (java 1.4)',
'Host': 'site.appspot.com', 'Content_Type': 'multipart/form-data;
boundary=cn2wRMd4fQphmeBcsYsjjJH7wfDtPm', 'X-Appengine-Region': 'eng', 'X-Appengine-City':
'crawley', 'X-Appengine-Citylatlong': '51.109140,-0.187227', 'Content-Type':
'multipart/form-data; boundary=cn2wRMd4fQphmeBcsYsjjJH7wfDtPm', 'X-Appengine-Country': 'GB'}
self.request.body:

--001a11333c426e860104f972b1fc
Content-Disposition: form-data; name="usersid"

xxxxx
--001a11333c426e860104f972b1fc
Content-Disposition: form-data; name="profilePicUpload"; filename="image.png"
Content-type: message/external-body; blob-key="xxxxx" ...
--cn2wRMd4fQphmeBcsYsjjJH7wfDtPm
Content-Disposition: form-data; name="usersid"

xxxxx
--cn2wRMd4fQphmeBcsYsjjJH7wfDtPm
Content-Disposition: form-data; name="profilePicUpload"; filename="image.jpg"
Content-type: application/octet-stream
....
这是来自Android的不成功请求:

self.request.params:

UnicodeMultiDict([(u'usersid', u'xxxxx'), (u'profilePicUpload', FieldStorage(u'profilePicUpload', u'image.png'))])
UnicodeMultiDict([(u'usersid', u'xxxxx'), (u'profilePicUpload', FieldStorage(u'profilePicUpload', u'image.jpg'))])
self.request.headers:

{'Origin': 'https://site.appspot.com', 'Accept-Language': 'en-GB,en-US;q=0.8,en;q=0.6',
'X-Appengine-Blobchunksize': '9521', 'X-Requested-With': 'XMLHttpRequest',
'X-Appengine-Blobupload': 'true', 'Accept': '*/*', 'User-Agent': 'Mozilla/5.0 (X11;
Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.132 Safari/537.36',
'Host': 'site.appspot.com', 'Cookie': 'xxxxx', 'Content_Type': 'multipart/form-data;
boundary=001a11333c426e860104f972b1fc', 'Referer': 'https://site.appspot.com/profile',
'Content-Type': 'multipart/form-data; boundary=001a11333c426e860104f972b1fc',
'X-Appengine-Country': 'ZZ', 'X-Appengine-Blobsize': '9521'}
{'Content_Length': '2103726', 'User-Agent': 'Apache-HttpClient/UNAVAILABLE (java 1.4)',
'Host': 'site.appspot.com', 'Content_Type': 'multipart/form-data;
boundary=cn2wRMd4fQphmeBcsYsjjJH7wfDtPm', 'X-Appengine-Region': 'eng', 'X-Appengine-City':
'crawley', 'X-Appengine-Citylatlong': '51.109140,-0.187227', 'Content-Type':
'multipart/form-data; boundary=cn2wRMd4fQphmeBcsYsjjJH7wfDtPm', 'X-Appengine-Country': 'GB'}
self.request.body:

--001a11333c426e860104f972b1fc
Content-Disposition: form-data; name="usersid"

xxxxx
--001a11333c426e860104f972b1fc
Content-Disposition: form-data; name="profilePicUpload"; filename="image.png"
Content-type: message/external-body; blob-key="xxxxx" ...
--cn2wRMd4fQphmeBcsYsjjJH7wfDtPm
Content-Disposition: form-data; name="usersid"

xxxxx
--cn2wRMd4fQphmeBcsYsjjJH7wfDtPm
Content-Disposition: form-data; name="profilePicUpload"; filename="image.jpg"
Content-type: application/octet-stream
....
对于第二种情况,self.get_uploads()返回一个空列表。你知道为什么吗


正如您所看到的,我的文件名前面没有像中那样缺少空格。

内容类型的
标题是什么?标准的内容类型标题是
内容类型
,但您同时发送这两个标题?我自己并不在@PeterKnego添加这两个标题。它似乎是由我在Chrome中的HTML表单和Android中的httpcore添加的。我在httpcore库代码中做了一个简短的查找,但找不到它的引用。它只提到内容类型。除非它以某种方式被应用程序引擎自动添加到请求中?