2011-11-10 4 views
2

Google App Engine Blobstore를 읽고 쓰는 데 Java API를 사용하고 있습니다.GAE Blobstore에 Zip 파일 작성

파일을 Blobstore에 직접 압축해야합니다. 즉, 압축 할 때 Blobstore에 저장하고자하는 객체가 String입니다.

내 문제는 표준 지퍼 링 방법이 OutputStream을 사용하여 작성하는 반면, GAE는 Blobstore에 쓰기를 제공하지 않는다는 것입니다.

이러한 API를 결합 할 수있는 방법이 있습니까? 아니면 사용할 수있는 API가 다른가요?

답변

6

잘못 입력하지 않았다면 Blobstore low level API을 사용해보세요. 그것은 자바 Channel (FileWriteChannel)를 제공합니다, 그래서 당신은 아마 OutputStream로 변환 할 수 있습니다 :.

Channels.newOutputStream(channel) 

그리고 java.util.zip와 그 출력 스트림을 사용 * 현재 사용중인 클래스 (here 당신은이를 자바 NIO를 사용하여 무엇인가를 Channel/OutputStream에 연결하는 관련 예제

나는 그것을 시도하지 않았다.

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

감사합니다, 그것은 도움이! – user1039343

+1

나는 새로운 사용자를 만난다. 문제를 해결 한 답변을 받아 들였음을 표시해야합니다. 그것은 다른 사람들에게도 도움이됩니다. –

0

여기 컨텐츠 파일을 작성하고 그것을 압축하여 Blob 저장소에 보관 한 예이다. 여기

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

    } 
0

다른 대답이 Blob 저장소 API를 사용하고 있지만, 현재 권장되는 방법은 앱 엔진 GCS 클라이언트를 사용하는 것입니다