1MB quota limit for a blobstore object in Google App Engine?

前端 未结 3 557
野趣味
野趣味 2020-12-17 00:47

I\'m using App Engine (version 1.4.3) direct write the blobstore in order to save images. when I try to store an image which is larger than 1MB I get the following Exceptio

相关标签:
3条回答
  • 2020-12-17 01:10

    As Brummo suggested above if you split it into chunks < 1MB it works. Here's some code.

    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);
    }
    
    0 讨论(0)
  • 2020-12-17 01:12

    The maximum object size is 2 GB but each API call can only handle a maximum of 1 MB. At least for reading, but I assume it may be the same for writing. So you might try to split your writing of the object into 1 MB chunks and see if that helps.

    0 讨论(0)
  • 2020-12-17 01:27

    Here is how I read and write large files:

    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);
    }
    
    0 讨论(0)
提交回复
热议问题