Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用XmlHttpRequest 2.0将5 MB文件上载到App Engine BlobStore?_Python_Google App Engine_File Upload - Fatal编程技术网

Python 如何使用XmlHttpRequest 2.0将5 MB文件上载到App Engine BlobStore?

Python 如何使用XmlHttpRequest 2.0将5 MB文件上载到App Engine BlobStore?,python,google-app-engine,file-upload,Python,Google App Engine,File Upload,我们都知道,对于大多数输入/输出请求,应用程序引擎将您的内存限制为1MB。但使用最新的BlobstoreAPI,您可以通过发布到动态生成的URL来完整上传大型文件 根据示例,以下是HTML表单的外观: self.response.out.write('<html><body>') self.response.out.write('<form action="%s" method="POST" enctype="multipart/form-data">'

我们都知道,对于大多数输入/输出请求,应用程序引擎将您的内存限制为1MB。但使用最新的BlobstoreAPI,您可以通过发布到动态生成的URL来完整上传大型文件

根据示例,以下是HTML表单的外观:

self.response.out.write('<html><body>')
self.response.out.write('<form action="%s" method="POST" 
  enctype="multipart/form-data">' % upload_url)
  self.response.out.write("""Upload File: 
<input type="file" name="file"><br> 
<input type="submit" name="submit" value="Submit"> 
</form></body></html>""")
您会注意到,这种技术将原始二进制文件作为
POST
正文发送。这很好,它可以在不需要BlobStore的情况下工作,最高可达1MB。在Python中,要读取文件,我只需使用:

img_data = self.request.body # got my image data now
然而,对于BlobStore,我应该使用

upload_files = self.get_uploads('file')  # 'file' is file upload field in the form
但我没有使用input type=file的HTML表单,我使用的是XmlHttpRequest——如何让应用引擎“认为”它是来自HTML表单的文件,从而“抓取”文件数据?

我的代码未经修改会导致错误

File "C:\Python26\lib\cgi.py", line 583, in keys
    raise TypeError, "not indexable"
TypeError: not indexable

您可能想查看我上传到blobstore(,)的博客文章,以及。

一般的共识是,到目前为止,App Engine的blobstore上传API将只接受多部分编码的帖子数据。。。换句话说,HTML输入类型=文件形式。或者,您可以使用Firefox通过FileReader API读取用户的二进制文件(通过拖放),并手动重建多部分编码。然后可以使用XmlHttpRequest异步提交数据

在撰写本文时,Chrome和Safari不支持FileReader对象,因此它们无法分解二进制文件,因此无法异步发送多部分编码


注意,如果小于1MB,drag N drop+XmlHttpRequest将文件上传到App Engine的方法在上述三种浏览器中仍然有效。

或者,有没有办法将原始帖子正文放入App Engine的BlobStore?谢谢,这让我们了解了很多。看起来我可能是S.运气不好,因为只有在firefox中才能实现这一点。这是因为只有Firefox支持直接读取文件,并进行多部分编码,不幸的是,应用程序引擎此时需要对BlobStore进行编码。看起来我必须切换到AmazonS3.PLUpload,我在文章的后面部分使用它,它支持几种上传方法,任何现代浏览器都应该至少支持一种。如果其他方法都失败了,像在烹饪书帖子中那样,使用动态生成的URL进行常规表单上传就可以了。是的,这是一个非常好的库,我可以利用它。我逐渐意识到我的问题是服务器端的问题,而不是客户端的问题。我已经成功地在Chrome5、Safari4和Firefox3.6中通过浏览器、拖放和XmlHttpRequests提交了二进制文件。如果我使用自己的PHP服务器,那么接受二进制数据服务器端并存储大型图像就不会有问题。然而,对于App Engine,截至目前,BlobStore只接受带有多部分编码的表单——换句话说,非XmlHttpRequests(除非您使用Firefox)您可以在XmlHTTPRequest中使用多部分编码——您只需自己创建多部分编码即可,但是,如果您打算用多部分编码对删除的文件进行编码,那么现在只能在Firefox中进行。这是因为Chrome和Safari没有读取二进制文件数据的权限(但它们可以将原始文件作为POST正文发送)。
File "C:\Python26\lib\cgi.py", line 583, in keys
    raise TypeError, "not indexable"
TypeError: not indexable