Coisas que eu quero fazer
Este código JavaScript recupera o conteúdo de um arquivo Zip/RAR em um servidor sem salvá-lo localmente.
O processo geral é o seguinte: (Nenhum arquivo será salvo localmente.)
Além de zip/rar, outras bibliotecas podem ser usadas.leva, gz, xz, Também disponível em Shinz2Aparentemente é compatível, mas seu funcionamento ainda não foi confirmado.
- Recuperar arquivos Zip/RAR do servidor (buscar)
- Recuperar arquivos de um arquivo zip/RAR
- (Exibir arquivo de imagem)
Estou usando NodeJS. (Isso não é obrigatório, pois estou usando para fins de teste.)
O artigo abaixo explica como acessar o conteúdo de um arquivo zip usando o zip.js.
Essa abordagem utiliza o npm, resultando em um gerenciamento de pacotes mais claro.
Embora não seja compatível com RAR, esta é uma boa opção se você precisar apenas de suporte para arquivos ZIP.
Arquivos RAR grandes não podem ser lidos. Esta é uma limitação da versão do libunrar que está sendo usada. Pode depender do ambiente, mas no meu caso, arquivos em torno de 300 MB se tornam instáveis.
Arquivos RAR divididos não são suportados. Isso ocorre porque o Unarchiver.js não os suporta. O libunrar os suporta, então seria possível adicionar suporte modificando o Unarchiver.js.
Configuração do ambiente
Faça o download do arquivo unarchiver.zip através do link de download no topo da página seguinte.

Extraia os arquivos baixados para qualquer pasta dentro do seu projeto.
(Aqui, foi extraído para src/unarchiver.)
implementação
Carregando o script
Adicione a seguinte linha ao HTML que você está usando para carregar o script.
Ele precisa ser carregado antes de qualquer JavaScript que utilize o descompactador.
(Por favor, altere o caminho src para corresponder ao seu ambiente. Se você não estiver usando Node.js, não será um caminho a partir do diretório raiz.)
<script src="/src/unarchiver/unarchiver.min.js"></script>Não especificar um tipo é correto. Especificar um módulo ou algo semelhante causará mau funcionamento.
Baixando arquivos Zip/rar e obtendo o arquivo inicial.
A implementação será feita da seguinte forma:
Estou baixando e extraindo o arquivo test.rar.
O primeiro arquivo armazenado no arquivo Zip será salvo no formato file_data.
O formato do arquivo pode ser usado como um blob.
await Unarchiver.load();
let url = 'test.rar';
const data = await fetch(url);
const blob = await data.blob();
const file = new File([blob], url.split('/').pop(), { type: blob.type });
const archive = await Unarchiver.open(file);
const entry = archive.entries[0]
const file_data = await entry.read()Utilização de arquivos (imagens)
Se os dados recuperados forem uma imagem JPEG, você poderá exibir o arquivo recuperado usando URL.createObjectURL.
(Uma tag img com o ID baixado é fornecida no HTML para fins de exibição.)
O exemplo acima usa `file_data`, mas em vez de obter o arquivo ao especificar o argumento para `createObjectURL`, o resultado é o mesmo.
const entry = archive.entries[0]
//const file_data = await entry.read()
if (entry.is_file && (entry.name.endsWith(".jpg") || entry.name.endsWith(".jpeg"))) {
const img = document.getElementById("downloaded");
img.src = URL.createObjectURL(await entry.read());
}Outras notas
Recuperando o segundo arquivo e os subsequentes
archive.entries é uma matriz de informações de arquivos.[1]Em seguida, você poderá acessar o segundo arquivo.
Em relação às subpastas
Observe que os arquivos zip e RAR se comportam de maneira diferente.
No caso do zíper
Os arquivos em subpastas também são incluídos em archive.entries.
As informações da pasta são armazenadas em zipReader.getEntries().Não está incluído.(O nome de cada arquivo inclui o caminho da pasta.)
No caso do RAR
Os arquivos em subpastas também são incluídos em archive.entries.
As informações da pasta são armazenadas em zipReader.getEntries().Está incluído.(O nome de cada arquivo inclui o caminho da pasta.)
A entrada da pasta retorna falso para .is_file e nulo para .read.
Resultado
Consegui usar JavaScript para recuperar o conteúdo de um arquivo Zip/RAR em um servidor sem salvá-lo localmente e, em seguida, exibir os arquivos de imagem.


コメント