2011-12-07 1 views
4

私のアプリでは、以下を実行する必要があります。 1.画像があるzipファイル(今はjpgsのみ)とその他のものがBlobStoreにアップロードされます。 2.アプリケーションエンジンのバックエンドは、アップロードされたzipからエントリを読み取り、BlobStore内にあるすべてのイメージをスタンドアロンファイルとして保存する必要があります。イメージをブロブストアに解凍する

ファイルを正常にアップロード、解凍、保存することはできますが、画像は壊れているようです。 BlobStoreからそれらをダウンロードすると(単にblobstoreService.serve)、画像の色が間違っているか、部分的に表示されたり、他の方法で壊れたりします。 ImagesServiceを使用しようとすると例外がスローされます。私は画像が圧縮される前に画像のサイズを確認し、ブロブストアに書き込まれている間にファイルのサイズが解凍され、同じように見えます。ここに私のコードです:

ZipInputStream zis = ...; 
ZipEntry entry; 
while ((entry =zis.getNextEntry()) !=null) 
{ 
    String fileName = entry.getName().toLowerCase(); 
    if(fileName.indexOf(".jpg") != -1 || fileName.indexOf(".jpeg") != -1)  
    { 
     FileService fileService = FileServiceFactory.getFileService(); 
     String mime = ctx.getMimeType(fileName);//getting mime from servlet context 
     AppEngineFile file = fileService.createNewBlobFile(mime, fileName); 
     boolean lock = true; 
     FileWriteChannel writeChannel = fileService.openWriteChannel(file, lock); 
     byte[] buffer = new byte[BlobstoreService.MAX_BLOB_FETCH_SIZE]; 
     while(zis.read(buffer) >= 0) 
     { 
      ByteBuffer bb = ByteBuffer.wrap(buffer); 
      writeChannel.write(bb); 
     } 
     writeChannel.closeFinally(); 
     BlobKey coverKey = fileService.getBlobKey(file); 
     .... 
    } 
} 

ありがとうたくさんの時間!

UPD:私は回避策を見つけましたが、最初の解決策が失敗した理由はまだ分かりません。

  int read; 
      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 

      while((read = zis.read()) >= 0) 
      { 
       baos.write(read); 
       if(baos.size() == BlobstoreService.MAX_BLOB_FETCH_SIZE) 
       { 
        ByteBuffer bb = ByteBuffer.wrap(baos.toByteArray()); 
        writeChannel.write(bb); 
        baos = new ByteArrayOutputStream(); 
       } 
      } 
      if(baos.size() > 0) 
      { 
       ByteBuffer bb = ByteBuffer.wrap(baos.toByteArray()); 
       writeChannel.write(bb); 
      } 
+0

は、ダウンロードしたものに、元の画像の実際の内容を比較してみ - 彼らはどのように異なるのですか? –

答えて

1

のため、zis.read(バッファ)がバッファ全体を占めていない可能性があります。

利用代わり

int len; 
while((len = zis.read(buffer)) >= 0){ 
    ByteBuffer bb = ByteBuffer.wrap(buffer, 0, len); 
    writeChannel.write(bb); 
} 

・ホープ以下、このヘルプ