我正在尝试在GAE应用程序中使用filepicker.io。 filepicker小部件返回用户上传的文件的URL。
那么,我如何使用此URL将文件上传到GAE的Blobstore中?
Blobstore仅支持“通过表单上传文件”,因此真正的问题是如何伪造包含文件URL的表单POST。
我正在尝试在GAE应用程序中使用filepicker.io。 filepicker小部件返回用户上传的文件的URL。
那么,我如何使用此URL将文件上传到GAE的Blobstore中?
Blobstore仅支持“通过表单上传文件”,因此真正的问题是如何伪造包含文件URL的表单POST。
from __future__ import with_statement
from google.appengine.api import files
from google.appengine.api import urlfetch
url = "http://www.facebook.com/somephoto.png"
result = urlfetch.fetch(url)
if result.status_code not 200:
return "some error"
# Create the file
file_name = files.blobstore.create(mime_type='application/octet-stream')
# Open the file and write to it
with files.open(file_name, 'a') as f:
f.write(result.content)
# Finalize the file. Do this before attempting to read it.
files.finalize(file_name)
# Get the file's blob key
blob_key = files.blobstore.get_blob_key(file_name)
最受欢迎答案中的文件API已过时,因此我在github上编写了一份要点来解决这个问题。它使用requests和poster将图像的URL发布到您自己的服务器。
我们实际上花了很多时间尝试绕过浏览器来伪造你描述的确切事物,但是没有成功。我的建议是像Kyle建议的那样编写一些快速的后端代码,从url中获取文件对象,但如果你真的坚持,你可以使用ajax伪造自己的多部分表单请求。
请参见XMLHttpRequest POST multipart/form-data和Is it possible to fake a multipart/form-data post with a jquery ajax call?以获取一些关于如何实现此操作的想法。