所以我正在尝试将 filepicker.io 与 GAE 应用程序一起使用。文件选择器小部件返回用户上传的文件的 URL。
然后如何使用此 url 将文件上传到 GAE 的 blobstore?
blobstore 仅支持“通过表单上传文件”,因此真正的问题是如何伪造包含文件 URL 的表单 POST。
所以我正在尝试将 filepicker.io 与 GAE 应用程序一起使用。文件选择器小部件返回用户上传的文件的 URL。
然后如何使用此 url 将文件上传到 GAE 的 blobstore?
blobstore 仅支持“通过表单上传文件”,因此真正的问题是如何伪造包含文件 URL 的表单 POST。
伪造表单帖子是可能的,但使用Files API要简单得多
编辑:
要将 File API 与 urlfetch 一起使用,您可以编写如下内容:
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)
我还没有测试过这个 - 所以如果这不起作用,请告诉我。
另外,我相信您可以将 mime_type 保留为“application/octet-stream”,App Engine 将尝试猜测正确的类型。如果这不起作用,请尝试将其更改为“image/png”。或者对于 pdf,mime 类型将是 'application/pdf'
投票最多的答案中的文件 API 已弃用,所以我在 github 上写了一个 gist 来解决这个问题。它获取图像的 url 并使用请求和海报将其发布到您自己的服务器。
实际上,我们花了很多时间试图找出是否可以绕过浏览器来伪造您描述的确切类型的东西,但无济于事。我的建议是编写一些快速的后端代码,比如 Kyle 建议从 url 中获取文件对象,但如果你真的坚持不懈,你实际上可以使用 ajax 伪造你自己的多部分表单请求。
请参阅XMLHttpRequest POST multipart/form-data和Is it possible to fake a multipart/form-data post with a jquery ajax call? 有关如何执行此操作的一些想法