java google-app-engine blobstore quota

java - ¿Límite de cuota de 1MB para un objeto blobstore en Google App Engine?



google-app-engine quota (3)

El tamaño máximo del objeto es de 2 GB, pero cada llamada API solo puede manejar un máximo de 1 MB. Al menos para leer, pero supongo que puede ser lo mismo para escribir. Por lo tanto, puede tratar de dividir la escritura del objeto en trozos de 1 MB y ver si eso ayuda.

Estoy usando App Engine (versión 1.4.3). Escribo directamente en blobstore para guardar imágenes. cuando trato de almacenar una imagen que es más grande que 1MB recibo la siguiente excepción

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

Pensé que el límite para cada objeto es de 2 GB

Aquí está el código de Java que almacena la imagen

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(); }


Como sugirió Brummo más arriba, si lo divide en trozos <1MB, funciona. Aquí hay un código.

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); }


Así es como leo y escribo archivos grandes:

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); }