2011-11-10 7 views
2

Google App Engine Blobstoreを読み書きするためにJava APIを使用しています。GAEブロブストアにZipファイルを書き込む

ファイルをBlobstoreに直接圧縮する必要があります。つまり、ZlobのときにBlobstoreに格納するオブジェクトがStringであることを意味します。

私の問題は標準的なジッパー方式ではOutputStreamを使用していますが、GAEではBlobstoreへの書き込みを提供していないようです。

これらのAPIを組み合わせる方法はありますか、使用できるAPIがありますか(私はそのようには見つかりませんでした)?

答えて

6

私が間違っていない場合は、Blobstore low level APIを試してみてください。これは、Java ChannelFileWriteChannel)を提供していますので、あなたはおそらくOutputStreamに変換できます。

Channels.newOutputStream(channel) 

そしてjava.util.zipでその出力ストリームを使用*あなたが現在使用しているクラス(hereあなたが持っているのJava NIOを使用して何かをZIPしてChannel/OutputStreamにある関連例

私はそれを試していません。ここで

+0

おかげで、それが助けました! – user1039343

+1

ここにあなたが新しいユーザーであることがわかります。あなたはあなたの問題を解決した答えを受け入れたものとしてマークするべきです。それは他の人にも役立ちます。 –

0

は、コンテンツファイルを作成し、それを圧縮し、ブロブストアにそれを格納するための一例である。

AppEngineFile file = fileService.createNewBlobFile("application/zip","fileName.zip"); 

try { 

    FileWriteChannel writeChannel = fileService.openWriteChannel(file, lock); 

    //convert as outputstream 
    OutputStream blobOutputStream = Channels.newOutputStream(writeChannel); 

    ZipOutputStream zip = new ZipOutputStream(blobOutputStream);      

    zip.putNextEntry(new ZipEntry("fileNameTozip.txt")); 

    //read the content from your file or any context you want to get 
    final byte data[] = IOUtils.toByteArray(file1InputStream);      

    //write byte data[] to zip 
     zip.write(bytes); 

    zip.closeEntry();      
    zip.close(); 

    // Now finalize 
    writeChannel.closeFinally(); 
} catch (IOException e) { 
    throw new RuntimeException(" Writing file into blobStore", e); 
} 
0

他の答えは、ブロブストアAPIを使用しているが、現在推奨される方法は、App EngineのGCSクライアントを使用することです。ここで

は、私がGCSで複数のファイルを圧縮するために使用するものである:

public static void zipFiles(final GcsFilename targetZipFile, 
          Collection<GcsFilename> filesToZip) throws IOException { 

    final GcsFileOptions options = new GcsFileOptions.Builder() 
      .mimeType(MediaType.ZIP.toString()).build(); 
    try (GcsOutputChannel outputChannel = gcsService.createOrReplace(targetZipFile, options); 
     OutputStream out = Channels.newOutputStream(outputChannel); 
     ZipOutputStream zip = new ZipOutputStream(out)) { 

     for (GcsFilename file : filesToZip) { 
      try (GcsInputChannel readChannel = gcsService.openPrefetchingReadChannel(file, 0, MB); 
       InputStream is = Channels.newInputStream(readChannel)) { 
       final GcsFileMetadata meta = gcsService.getMetadata(file); 
       if (meta == null) { 
        log.warn("{} NOT FOUND. Skipping.", file.toString()); 
        continue; 
       } 
       final ZipEntry entry = new ZipEntry(file.getObjectName()); 
       zip.putNextEntry(entry); 

       ByteStreams.copy(is, zip); 
       zip.closeEntry(); 
      } 
      zip.flush(); 
     } 

    } 
関連する問題