在我的Android应用程序中,我想将图像上传到Blobstore,然后检索上传URL和图像的Blobkey,这样我就可以将Blobkey存储在DataStore中.
我试过这段代码,但我的图片没有上传:
Servlet(返回上传网址)
BlobstoreService blobstoreService = BlobstoreServiceFactory
.getBlobstoreService();
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
UploadOptions uploadOptions = UploadOptions.Builder
.withGoogleStorageBucketName("photobucket11")
.maxUploadSizeBytes(1048576);
String blobUploadUrl = blobstoreService.createUploadUrl("/upload",
uploadOptions);
// String blobUploadUrl = blobstoreService.createUploadUrl("/uploaded");
resp.setStatus(HttpServletResponse.SC_OK);
resp.setContentType("text/plain");
PrintWriter out = resp.getWriter();
out.print(blobUploadUrl);
}
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
doGet(req, resp);
}
Run Code Online (Sandbox Code Playgroud)
代码:Android客户端
Bitmap bmp = BitmapFactory.decodeFile(imagePath);
ByteArrayOutputStream out = new ByteArrayOutputStream();
bmp.compress(CompressFormat.JPEG, 75, out);
byte[] imgByte = out.toByteArray();
String encodedImage = Base64.encodeToString(imgByte,
Base64.DEFAULT);
HttpClient httpClient = new DefaultHttpClient(); …Run Code Online (Sandbox Code Playgroud) 我正在使用Google App Engine Blobstore来存储一系列文件类型(PDF,XLS等),并且我正在尝试找到一种机制,通过该机制可以使用上传文件的原始文件名(存储在blob_info中)来命名下载的文件,即用户在保存对话框中看到'some_file.pdf'而不是'very_long_db_key.pdf'.
我在文档中看不到任何允许这样的内容:
http://code.google.com/appengine/docs/python/blobstore/overview.html
我在其他帖子中看到了一些提示,你可以使用blob_info中的信息来设置content-disposition头.这是实现理想目标的最佳方法吗?
问题: 由于blobstore中的每个文件在数据存储区中都有一个关联的BlobInfo实体,我是否像其他任何数据存储区实体一样收取该实体的写入/读取成本?
背景:
我们在App Engine上存储了数百万个图像,我们目前将它们存储在数据存储区实体中(图像小于1MB).我想知道使用blobstore是否会降低我们的成本.我并不担心存储成本.真正的成本是写作和阅读的行为,所以这就是我想要减少的.现在我们支付数据存储实体的写入和读取费用,每个图像一个实体.
另一方面,使用blobstore,写入/读取(实例小时数除外)似乎没有单独的成本,但每个blob在数据存储区中都有一个特殊的BlobInfo实体,可以查询blob.从文档中可以清楚地看出,这些实体在成本方面是否被视为任何其他数据存储区实体(每个实体写入2个Ops,每个索引属性写入2个写入操作)?
问题
使用Go Blobstore API上载文件时,成功路径会重定向到错误的appengine模块.这是对问题的更直观的描述:
http://A.my-appengine-app.com/uploadhttp://A.my-appengine-app.com/upload/session/upload/session运行以下Go代码的处理程序:url, err := blobstore.UploadURL(c, "/upload/success")http://A.my-appengine-app.com/_ah/upload/[some long hash]/actiona中<form>.POST向URL 提交多部分请求/upload/success这是事情变得奇怪的地方.在开发中,服务器重定向到模块A中的 "/ upload/success" .在生产中,服务器重定向到主模块,我们可以称之为乙现在.我可以告诉这种情况正在发生,因为我404在我的Web控制台中获得了一个日志表明正在向模块B发出请求.我甚至已经明确地将主机名作为成功路径的一部分传递(步骤#3),但是没有效果.
当前解决方案(不理想)
似乎我唯一的办法是在模块B中定义一个处理程序来处理请求,就像模块A那样.由于goapp架构将所有模块组合在一起,这不是世界上最差的权衡,但鉴于模块应该是垂直独立的,它在语义上是错误的.如果有人知道如何解决这个问题,我将不得不承担责任.现在,我将采取上述方法.
google-app-engine go blobstore app-engine-modules gae-module
我是以编程方式上传图像文件并想设置文件名.当我通过POST上传文件时,会自动设置filename属性.但是,使用下面的方法时,文件名未设置.
image = urllib2.urlopen(url)
file_name = files.blobstore.create(mime_type='image/png')
with files.open(file_name, 'a') as f:
f.write(image.read())
files.finalize(file_name)
image_blob_key = files.blobstore.get_blob_key(file_name)
Run Code Online (Sandbox Code Playgroud) 我在我的网站上使用App Engine的高性能图像服务,并且我能够在我的本地机器和生产中正常工作,即我可以上传图像并使用blob键上的get_serving_url成功显示图像.但是,这些图像似乎不会在我的开发服务器上持续存在,即在我从计算机重新启动后返回时,图像不再显示.开发服务器吐出:
images_service_pb.ImagesServiceError.BAD_IMAGE_DATA
我猜它实际上是因为潜在的斑点不再存在(虽然这只是一种预感).我的数据存储的其余部分仍然完好无损,因为我正在使用启动设置"--datastore_path"来确保我的数据仍然存在.是否有一个单独的标志我需要用来持久保存blob?或者这里有一个我错过的单独问题?
我正在将一些图像上传到GAE的Blobstore.上传成功,当我在GAE控制台中看到图像时,我可以看到它们以预期的大小和分辨率存储.
根据这个网站,要获得上传图像的URL,我可以使用:
BlobKey blobKey = (BlobKey) blobs.get("image");
ImagesService imagesService = ImagesServiceFactory.getImagesService();
String imageUrl = imagesService.getServingUrl(blobKey);
Run Code Online (Sandbox Code Playgroud)
生成的URL指向较小版本的上载图像(大小和质量).如何获取存储在Blobstore中的完整大小图像的URL?
我是一名新手程序员,也是Google App Engine和webapp2等的新手.所以这可能是一个非常基本的问题.
我正在创建一个将图像存储到BlobStore的应用程序.我的模型存储描述,blob_key,图像URL和日期.
我能够保存所有东西,所以这一点都没关系.
但是现在我想创建一个删除按钮,它不仅会删除数据存储区中的项目,还会删除保存在blobstore中的图像.
我创建了一个DeleteHandler,并在html中有一个表单,传递我想要删除的项的键.在DeleteHandler中,我使用发布的密钥从数据存储中删除项目.我也在尝试使用密钥来删除保存在blobstore中的图像.
到目前为止,我在删除表单帖子上得到了404,即使我已经过去了,我也不确定我的DeleteHandler是否正确处理我正在寻找的功能.
任何帮助将非常感激..
Main.py:
import os
import urllib
import webapp2
from google.appengine.ext.webapp import template
from google.appengine.ext import blobstore
from google.appengine.ext.webapp import blobstore_handlers
from google.appengine.api import images
#Models
from google.appengine.ext import db
class ImageItem(db.Model):
description = db.StringProperty(required=True)
img_url = db.StringProperty()
blob_key = blobstore.BlobReferenceProperty()
when = db.DateTimeProperty(auto_now_add=True)
#Handlers (Views)
class MainHandler(webapp2.RequestHandler):
def get(self):
upload_url = blobstore.create_upload_url('/upload')
imgs = db.GqlQuery(
'SELECT * FROM ImageItem '
'ORDER BY when DESC')
imgs_dict = {'imgs': imgs}
self.response.out.write( template.render( 'main.html',locals() ) …Run Code Online (Sandbox Code Playgroud) 当我从blobstore提供下载时,我注意到浏览器没有显示剩余的总大小和时间,下载一直持续到完成,但浏览器似乎不知道预期的总大小.
注意:
这只发生在appspot.com的生产服务器中.在开发环境(localhost)中,事情按预期工作,浏览器显示总大小,完成百分比和剩余的大约时间......
我试图将标题'Content-Length'设置为blob大小,没有运气.
在分析下载的blob的标题时,Content-Length标头不存在(即使我在使用"send_blob"之前写了它).标题是这样的:
HTTP/1.0 200 OK =>
Cache-Control => no-cache
Content-Disposition => attachment; filename ="Setup.exe"
Expires => Fri,01 Jan 1990 00:00:00 GMT
Content-Type => application/octet-stream
Date => Thu,31 Mar 2011 20:19:52 GMT
Server => Google Frontend
任何人都知道如何让浏览器显示总大小,下载百分比和估计的剩余时间?
我们试图避免保存重复的文件.但是,我们的md5结果总是与BlobInfo不同.
我们如何计算它:
MessageDigest messageDigest = java.security.MessageDigest.getInstance("MD5");
digest = messageDigest.digest(bytes);
String digestString = DigestUtils.md5Hex(digest);
Run Code Online (Sandbox Code Playgroud)
它不符合: (new BlobInfoFactory().loadBlobInfo(blobKey)).getMd5Hash();
示例不匹配:
google vs my own calculation:
8cdeb6db94bc4fd156e2975fd8ebbcf2 vs 9003b37afbf3637de96c35774069453f
65a25dafcba58d16d58a9c7585cc3932 vs 52383159f7d27417d50121aaee2728b5
5cccc2d690fdc0c254234d5526876b34 vs 8196da9b6733daa60e08d927693df483
Run Code Online (Sandbox Code Playgroud)
它在生产服务器上.(我们没有测试开发环境)
google-app-engine md5 duplicate-removal message-digest blobstore