Запись Zip-файлов в GAE Blobstore - PullRequest
2 голосов
/ 10 ноября 2011

Я использую Java API для чтения и записи в Blobstore Google App Engine.

Мне нужно заархивировать файлы непосредственно в Blobstore, что означает, что у меня есть String объекты, которые я хочу сохранить в Blobstore при архивировании.

Моя проблема в том, что стандартные методы архивирования используют OutputStream для записи, в то время как кажется, что GAE не предоставляет один для записи в Blobstore.

Есть ли способ объединить эти API, или я могу использовать разные API (я не нашел такого)?

Ответы [ 3 ]

6 голосов
/ 10 ноября 2011

Если я не ошибаюсь, вы можете попробовать использовать API низкого уровня Blobstore .Он предлагает Java Channel (FileWriteChannel), так что вы, вероятно, можете преобразовать его в OutputStream:

Channels.newOutputStream(channel)

и использовать этот выходной поток с классами java.util.zip. *в настоящее время используется ( здесь у вас есть связанный пример, который использует Java NIO для архивирования чего-либо в Channel / OutputStream)

Я не пробовал.

0 голосов
/ 13 января 2014

Другой ответ - использование API BlobStore, но в настоящее время рекомендуется использовать GCS-клиент App Engine.

Вот что я использую для архивирования нескольких файлов в 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 голосов
/ 14 января 2013

Вот один пример, чтобы написать файл содержимого, сжать его и сохранить в blobstore:

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