Google App Engine中blobstore对象的1MB配额限制?

我正在使用App Engine(版本1.4.3)直接编写blobstore以保存图像。 当我尝试存储大于1MB的图像时,我得到以下exception

com.google.apphosting.api.ApiProxy$RequestTooLargeException: The request to API call datastore_v3.Put() was too large. 

我认为每个对象的限制是2GB

这是存储图像的Java代码

 private void putInBlobStore(final String mimeType, final byte[] data) throws IOException { final FileService fileService = FileServiceFactory.getFileService(); final AppEngineFile file = fileService.createNewBlobFile(mimeType); final FileWriteChannel writeChannel = fileService.openWriteChannel(file, true); writeChannel.write(ByteBuffer.wrap(data)); writeChannel.closeFinally(); } 

最大对象大小为2 GB,但每个API调用最多只能处理1 MB。 至少对于阅读来说,但我认为写作可能是一样的。 因此,您可能会尝试将对象的写入分成1 MB块,看看是否有帮助。

这是我如何读写大文件:

 public byte[] readImageData(BlobKey blobKey, long blobSize) { BlobstoreService blobStoreService = BlobstoreServiceFactory .getBlobstoreService(); byte[] allTheBytes = new byte[0]; long amountLeftToRead = blobSize; long startIndex = 0; while (amountLeftToRead > 0) { long amountToReadNow = Math.min( BlobstoreService.MAX_BLOB_FETCH_SIZE - 1, amountLeftToRead); byte[] chunkOfBytes = blobStoreService.fetchData(blobKey, startIndex, startIndex + amountToReadNow - 1); allTheBytes = ArrayUtils.addAll(allTheBytes, chunkOfBytes); amountLeftToRead -= amountToReadNow; startIndex += amountToReadNow; } return allTheBytes; } public BlobKey writeImageData(byte[] bytes) throws IOException { FileService fileService = FileServiceFactory.getFileService(); AppEngineFile file = fileService.createNewBlobFile("image/jpeg"); boolean lock = true; FileWriteChannel writeChannel = fileService .openWriteChannel(file, lock); writeChannel.write(ByteBuffer.wrap(bytes)); writeChannel.closeFinally(); return fileService.getBlobKey(file); } 

正如Brummo上面提到的那样,如果你将它分成大块<1MB,它就可以了。 这是一些代码。

 public BlobKey putInBlobStoreString(String fileName, String contentType, byte[] filebytes) throws IOException { // Get a file service FileService fileService = FileServiceFactory.getFileService(); AppEngineFile file = fileService.createNewBlobFile(contentType, fileName); // Open a channel to write to it boolean lock = true; FileWriteChannel writeChannel = null; writeChannel = fileService.openWriteChannel(file, lock); // lets buffer the bitch BufferedInputStream in = new BufferedInputStream(new ByteArrayInputStream(filebytes)); byte[] buffer = new byte[524288]; // 0.5 MB buffers int read; while( (read = in.read(buffer)) > 0 ){ //-1 means EndOfStream ByteBuffer bb = ByteBuffer.wrap(buffer); writeChannel.write(bb); } writeChannel.closeFinally(); return fileService.getBlobKey(file); }