我正在尝试生成一个zip文件并存储在App Engine的Blobstore中.现在,我没有从Blobstore获得有效的zip文件.不确定问题是压缩,存储,检索还是下载.
我已经根据以下问题的片段构建了代码.
在Blobstore中存储后,我让用户通过Flask应用程序下载它.
这是我想要做的事情的要点.
def zipit():
zipstream = StringIO.StringIO()
zfile = zipfile.ZipFile(file=zipstream, mode='w')
bytes = "lorem ipsum dolor sit amet"
zfile.writestr('loremipsum', bytes, compress_type=zipfile.ZIP_STORED)
zfile.close()
zipstream.seek(0)
return zipstream.getvalue()
zip_file = files.blobstore.create(mime_type='application/zip')
zip_data = zipit()
with files.open(zip_file, 'a') as f:
f.write(zip_data)
files.finalize(zip_file)
blob_key = files.blobstore.get_blob_key(zip_file)
blob_data = blobstore.BlobReader(blob_key).read()
# http://flask.pocoo.org/docs/api/
response = make_response(blob_data)
response.headers['Content-Type'] = 'application/zip'
response.headers['Content-Disposition'] = 'attachment; filename="loremipsum.zip"'
return response
Run Code Online (Sandbox Code Playgroud)
任何帮助深表感谢.
我有blob存储在我的Blobstore中,并希望将这些文件推送到Google云端硬盘.当我使用Google App Engine UrlFetchService时
URLFetchService fetcher = URLFetchServiceFactory.getURLFetchService();
URL url = new URL("https://www.googleapis.com/upload/drive/v1/files");
HTTPRequest httpRequest = new HTTPRequest(url, HTTPMethod.POST);
httpRequest.addHeader(new HTTPHeader("Content-Type", contentType));
httpRequest.addHeader(new HTTPHeader("Authorization", "OAuth " + accessToken));
httpRequest.setPayload(buffer.array());
Future<HTTPResponse> future = fetcher.fetchAsync(httpRequest);
try {
HTTPResponse response = (HTTPResponse) future.get();
} catch (Exception e) {
log.warning(e.getMessage());
}
Run Code Online (Sandbox Code Playgroud)
问题:当文件超过5 MB时,它超出了UrlFetchService请求大小的限制(链接:https://developers.google.com/appengine/docs/java/urlfetch/overview#Quotas_and_Limits)
替代方案:使用Google Drive API我有以下代码:
File body = new File();
body.setTitle(title);
body.setDescription(description);
body.setMimeType(mimeType);
// File's content.
java.io.File fileContent = new java.io.File(filename);
FileContent mediaContent = new FileContent(mimeType, fileContent); …Run Code Online (Sandbox Code Playgroud) 我一直在阅读有关数据存储区与blobstore的stackoverflow,用于存储和检索图像文件.一切都指向blobstore,除了一个:隐私和安全.
在数据存储区中,我的用户的照片是私密的:我可以完全控制谁获得blob.但是,在blobstore中,任何知道该网址的人都可以想象访问我的用户照片吗?真的吗?
这是一个应该让我安心的报价,但它仍然不清楚.所以有blob键的人仍然可以访问这些照片吗?(来自Blobstore中的商店照片或数据存储中的Blob - 哪个更好/更有效/更便宜?)
从Blobstore中提供值的方式是接受对应用程序的请求,然后使用密钥响应X-AppEngine-BlobKey标头.App Engine拦截传出响应,并使用直接从服务流式传输的Blobstore值替换正文.由于应用程序逻辑首先设置标头,因此应用程序可以实现它想要的任何访问控制.没有应用程序干预,没有默认URL直接在Blobstore之外提供值.
所有这一切都要问:对于贩卖图片,哪个更私密,更安全,以及为什么:数据存储区或blobstore?或者,嘿,google-cloud-storage(我目前一无所知)
google-app-engine blobstore python-2.7 google-cloud-storage google-cloud-datastore
我想使用blobstore存储图像的过程以保存数据存储区中的blob键结束.所以在下面的代码中,应该在我的后端,为什么我需要一个重定向URL,因为我已经有了blob密钥?为什么我不只是将blob密钥保存在我的数据存储区中然后返回它?
public class Upload extends HttpServlet {
private BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
Map<String, BlobKey> blobs = blobstoreService.getUploadedBlobs(req);
BlobKey blobKey = blobs.get("myFile");
if (blobKey == null) {
res.sendRedirect("/");
} else {
res.sendRedirect("/serve?blob-key=" + blobKey.getKeyString());
}
}
}
Run Code Online (Sandbox Code Playgroud)
此代码来自教程:https://developers.google.com/appengine/docs/java/blobstore/overview#Complete_Sample_App
错误
引起:java.lang.IllegalStateException:必须从blob上传回调请求中调用.在com.google.appengine.api.blobstore.BlobstoreServiceImpl.getUploads(BlobstoreServiceImpl.java:169)
码
public class UserUploadProfilePictureResource extends ServerResource {
@Post
public void handleBlobstoreUpload(Representation entity) {
Representation rep =null;
if (entity !=null) {
if (MediaType.MULTIPART_FORM_DATA.equals(entity.getMediaType(), true)) {
Request restletRequest = getRequest();
HttpServletRequest servletRequest = ServletUtils.getRequest(restletRequest);
BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
Map<String, List<BlobKey>> blobs = blobstoreService.getUploads(servletRequest);
Run Code Online (Sandbox Code Playgroud)
可能的解决方案(但我不想要)
第一.我不想调用第二个HttpServlet.
第二.关于这篇文章,有手动编写文件的解决方案:
谷歌说:
不推荐使用:此处用于将文件写入Blobstore的文件API功能将在将来的某个时间删除,有利于将文件写入Google云端存储并使用Blobstore为其提供服务.
可能的解决方案2(但只是解决方法的概念)
http://www.cloudave.com/1055/the-new-google-app-engine-blobstore-api-first-thoughts/
Bret Slatkin指出,当API制作用于上传文件的POST URL时,它会创建一个唯一的一次性URL,以减轻任何可能的嗅探.
这非常适合用于呈现用户提交的Web表单的情况.但是,如果您尝试提供允许上传文件的REST API(例如,想想像TwitPic这样的东西)会让事情变得更难.在这种情况下,您将必须编写自己的渲染,模拟Web表单将执行的操作(获取文件,创建随机POST URL,调用它,...)
题
在Google应用引擎中存储图片的最佳方法是什么?有没有比blobstore更好的方法?如何在blobstore中存储图像?
AppEngine的标准API假设文件是从HTML表单上传的.我正在尝试从REST API方法将文件发布到blobstore,该方法可以由非Html客户端(Flash,iPhone等)调用
我正在努力工作的代码:
# Get the blobstore upload url
upload_url = blobstore.create_upload_url("/activities/upload_finished");
# Make sync call to the blobstore url to post our image
result = urlfetch.fetch(url=upload_url,
payload=request.FILES,
method=urlfetch.POST,
headers={'Content-Type': 'multipart/form-data'})
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
ValueError:无效边界
任何的想法?
有没有人试过不通过网络表单发布到blobstore?
多部分形式:''
我正在构建一个app-engine端点api,它从用户(Android应用程序)获取图片并以编程方式将其保存到blobstore.然后我将blob_key保存在我的数据存储区中.代码如下:
首先,我通过我接收到的图像@endpoint.method为messages.BytesField:
image_data = messages.BytesField(1,required = True)
然后我像这样保存到blobstore:
from google.appengine.api import files
def save_image(data):
# Create the file
file_name = files.blobstore.create(mime_type='image/png')
# Open the file and write to it
with files.open(file_name, 'a') as f:
f.write('data')
# 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)
return blob_key # which is then saved to datastore
Run Code Online (Sandbox Code Playgroud)
现在我想把图像送回来.我不知道如何将以下代码放入我的端点api:
from google.appengine.ext import blobstore
from google.appengine.ext.webapp import blobstore_handlers
class ServeHandler(blobstore_handlers.BlobstoreDownloadHandler): …Run Code Online (Sandbox Code Playgroud) google-app-engine android blobstore python-2.7 google-cloud-endpoints
我想使用mapreduce库来更新满足查询的所有实体.有几个并发症:
我知道如何将csv文件上传到Blobstore并使用Blobstore输入阅读器读取每一行.我也知道使用查询获取实体的数据存储区输入阅读器.
我的问题是如何创建一个Mapper类,从Blobstore读取输入数据,获取数据存储区实体并尽可能高效地更新它们?
java google-app-engine mapreduce blobstore google-cloud-datastore
我正在使用Google App Engine for Java,我正在尝试为处理blobstore的代码编写JUnit测试.如何在blobstore中放置blob以在测试期间使用(在配置为使用LocalBlobstoreServiceTestConfig将所有内容保存在内存中之后)?似乎解决方案应该非常简单和基本,但不知怎的,我找不到它.
我想可以使用Files API,但我已经避开了它,因为它已经停止(下周).
我知道在测试之外将blob放入blobstore的唯一方法是通过多部分表单上传.但是,我不知道如何在JUnit测试的上下文中这样做.
也可以通过blobstore API与Google Cloud Storage对象进行交互,但我选择使用vanilla blobstore,这样我就不需要将另一个服务(及其客户端库)循环到我的应用程序中.
所以我再次问,如何在那里获得一个blob,以便我可以测试使用它的代码?