A partir de um Blob criar um pasta jogar o Blob dentro e Zipar [Resolvido]

BOm pessoal boa tarde alguém poderia me dar uma ideia de como faço a partir de um campo Blob Criar uma pasta em memória (não sei como isso pode ser feito) depois dentro dessa pasta jogar o Blob (IMG)…
Porque depois preciso gerar um zip e baixar…

Valeu!

O que você quer dizer com criar pasta em memória?
Está falando da pasta dentro do arquivo ZIP ?

Você pode abrir o Blob como uma InputStream, e usando um buffer de 1 kByte (array de bytes de 1024 posições), copiar esses dados para uma ZipOutputStream.

Essa ZipOutputStream pode ser redirecionada para o socket da sua servlet, por exemplo.

Não é preciso, nem necessário, nem desejável copiar todo o blob para a memória para então gerar o zip. Isso é porque você pode ter blobs muito grandes que acabem estourando a memória do seu web container.

Então preciso criar uma pasta com a imagem Blob dentro e dpois zipar…Depois colocar em memória e disponibilizar para download…

Isso é o que fazemos para criar manualmente um arquivo zip… monta a estrutura de diretórios, coloca os arquivos desejados, e depois zipa a pasta inteira.

Mas é preciso entender que para criar o zip programaticamente é diferente.
Todos os arquivos são incluídos no zip como um “Zip Entry”. Esse zip entry contém o nome de arquivo e um caminho; não existem pastas.

Os programas que abrem arquivos ZIP é que mostram e extraem o conteúdo em forma de pasta, mas dentro do pacote os arquivos não estão organizados dentro de pastas… apenas estão um do lado do outro, e contém uma informação de caminho.

Não sei se expliquei direito ou confundi ainda mais, só estou querendo dizer que tem que se livrar dessa forma de pensar, de querer colocar em uma pasta e depois zipar.
O que o entaglement disse nos posts dele é para simplesmente ler o blob jogando seu conteúdo diretamente no ZIP. E na hora de construir os objetos você menciona que quer incluir um caminho para o Zip Entry.

Não sei de cabeça como fazer, mas uma pesquisa por java zip vai mostrar vários exemplos de código.

Isso é o que fazemos para criar manualmente um arquivo zip… monta a estrutura de diretórios, coloca os arquivos desejados, e depois zipa a pasta inteira.

Mas é preciso entender que para criar o zip programaticamente é diferente.
Todos os arquivos são incluídos no zip como um “Zip Entry”. Esse zip entry contém o nome de arquivo e um caminho; não existem pastas.

Os programas que abrem arquivos ZIP é que mostram e extraem o conteúdo em forma de pasta, mas dentro do pacote os arquivos não estão organizados dentro de pastas… apenas estão um do lado do outro, e contém uma informação de caminho.

Não sei se expliquei direito ou confundi ainda mais, só estou querendo dizer que tem que se livrar dessa forma de pensar, de querer colocar em uma pasta e depois zipar.
O que o entaglement disse nos posts dele é para simplesmente ler o blob jogando seu conteúdo diretamente no ZIP. E na hora de construir os objetos você menciona que quer incluir um caminho para o Zip Entry.

Não sei de cabeça como fazer, mas uma pesquisa por java zip vai mostrar vários exemplos de código.[/quote]

Entendi sim o que vc quis dizer… Só que não estou achando exemplos explicando de como fazer, você teria algum exemplo para me ajudar? obrigado…

Um exemplo básico:

[code]
InputStream inputStream = … // aqui voce obtem o caminho para o input stream dos dados de entrada (conteudo)
OutputStream outputStream = … // stream de saida. Pode ser o outputstream da servlet, ou um FileOutputStream para gravar o zip em arquivo

        ZipOutputStream zip = new ZipOutputStream(outputStream);
        ZipEntry zipEntry = new ZipEntry("nome_da_pasta_dentro_do_zip/nome_do_arquivo_dentro_do_zip.xxx");
        zip.putNextEntry(zipEntry);

        byte[] buffer = new byte[2048];
        int byteCount;

        while (-1 != (byteCount = inputStream.read(buffer))) {
            zip.write(buffer, 0, byteCount);
        }

        zip.closeEntry();
        inputStream.close();
        zip.close();[/code]

[quote=gomesrod]Um exemplo básico:

[code]
InputStream inputStream = … // aqui voce obtem o caminho para o input stream dos dados de entrada (conteudo)
OutputStream outputStream = … // stream de saida. Pode ser o outputstream da servlet, ou um FileOutputStream para gravar o zip em arquivo

        ZipOutputStream zip = new ZipOutputStream(outputStream);
        ZipEntry zipEntry = new ZipEntry("nome_da_pasta_dentro_do_zip/nome_do_arquivo_dentro_do_zip.xxx");
        zip.putNextEntry(zipEntry);

        byte[] buffer = new byte[2048];
        int byteCount;

        while (-1 != (byteCount = inputStream.read(buffer))) {
            zip.write(buffer, 0, byteCount);
        }

        zip.closeEntry();
        inputStream.close();
        zip.close();[/code][/quote]

Fala Gomes blza? obrigado pela ajuda deu certo de criar uma pasta, mas se eu precisa criar mais pastas na raiz? tem mais alguma outra forma… obrigado…

Aii pessoal consegui graças a ajuda do pessoal ai obrigado… segue abaixo a solução… :smiley:

                        ZipOutputStream out = null;
                        ZipEntry arquivo1 = new ZipEntry("Pasta1/" + path + files[i].getName());
                        ZipEntry arquivo2 = new ZipEntry("Pasta2/" + path + files[j].getName());
                        ZipEntry arquivo3 = new ZipEntry("Pasta3/" + path + files[k].getName());
                        out.putNextEntry(arquivo1);
                        out.putNextEntry(arquivo2);
                        out.putNextEntry(arquivo3);