我需要以编程方式从blob存储中获取blob,而不需要事先知道其大小。有人知道怎么做吗?
我试过使用
BlobstoreService blobStoreService = BlobstoreServiceFactory.getBlobstoreService();
byte[] picture = blobStoreService.fetchData(blobKey, 0, Integer.MAX_VALUE);
但我得到了一个错误,因为(至少看起来(Integer.MAX_VALUE
太大了。
java.lang.IllegalArgumentException: Blob fetch size 2147483648 it larger than maximum size 1015808 bytes.
at com.google.appengine.api.blobstore.BlobstoreServiceImpl.fetchData(BlobstoreServiceImpl.java:250)
那么,有人知道如何正确地做到这一点吗?另外,如果你能顺便告诉我,将图片以"jpeg"或"png"的形式放入blobstore更好吗?
希望这能有所帮助,这是我一段时间以来的做法:
BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
BlobKey blobKey = new BlobKey(KEY);
// Start reading
ByteArrayOutputStream out = new ByteArrayOutputStream();
long inxStart = 0;
long inxEnd = 1024;
boolean flag = false;
do {
try {
byte[] b = blobstoreService.fetchData(blobKey,inxStart,inxEnd);
out.write(b);
if (b.length < 1024)
flag = true;
inxStart = inxEnd + 1;
inxEnd += 1025;
} catch (Exception e) {
flag = true;
}
} while (!flag);
byte[] filebytes = out.toByteArray();
我以前用过:
BlobInfo blobInfo = blobInfoFactory.loadBlobInfo(blobKey);
filesize = blobInfo.getSize();
以获取大小,但由于某种原因,有时此信息为空。
也许所有这些都能给你一个想法。
def blob_fetch(blob_key):
blob_info = blobstore.get(blob_key)
total_size = blob_info.size
unit_size = blobstore.MAX_BLOB_FETCH_SIZE
pos = 0
buf = cStringIO.StringIO()
try:
while pos < total_size:
buf.write(blobstore.fetch_data(blob_key, pos, min(pos + unit_size - 1, total_size)))
pos += unit_size
return buf.getvalue()
finally:
buf.close()
MAX_BLOB_FETCH_SIZE
在文档中不明显。
在Python中:
from google.appengine.ext.blobstore import BlobInfo
from google.appengine.api import blobstore
import cStringIO as StringIO
blobinfo = BlobInfo.get(KEY)
offset = 0
accumulated_content = StringIO.StringIO()
while True:
fetched_content = blobstore.fetch_data(
blobinfo.key(),
offset,
offset + blobstore.MAX_BLOB_FETCH_SIZE - 1)
accumulated_content.write(fetched_content)
if len(fetched_content) < blobstore.MAX_BLOB_FETCH_SIZE:
break
offset += blobstore.MAX_BLOB_FETCH_SIZE