Não tenho certeza se isso é possível usando tecnologias padrão da web.
Desejo que o usuário possa baixar vários arquivos em uma única ação. Isto é, clique nas caixas de seleção ao lado dos arquivos e obtenha todos os arquivos que foram verificados.
É possível - se sim, qual estratégia básica você recomenda. Eu sei que posso usar a tecnologia de cometas para criar eventos do lado do servidor que acionam um HttpResponse, mas espero que haja uma maneira mais simples.
http
web-applications
download
Ankur
fonte
fonte
fonte
link.setAttribute('download', null);
renomeei todos os meus arquivos para null.link.setAttribute('download',filename)
interior do loop. Isso permite que você nomeie os arquivos como desejar. Além disso, acredito que precisa ser apenas o nome do arquivo, não incluindo a URL. Acabei enviando dois arrays: um com o URL completo e outro apenas com o nome do arquivo.Minecraft.jar
.Você pode criar um conjunto temporário de iframes ocultos, iniciar o download por GET ou POST dentro deles, aguardar o início dos downloads e remover os iframes:
Ou, sem jQuery:
fonte
setTimeout()
?Esta solução funciona em vários navegadores e não dispara avisos. Em vez de criar um
iframe
, aqui criamos um link para cada arquivo. Isso evita que mensagens de aviso apareçam.Para lidar com a parte do loop, usamos
setTimeout
, que é necessário para que funcione no IE.fonte
Google Chrome Version 76.0.3809.100 (Official Build) (64-bit)
.A maneira mais fácil seria servir os vários arquivos agrupados em um arquivo ZIP.
Suponho que você possa iniciar vários downloads de arquivo usando um monte de iframes ou pop-ups, mas do ponto de vista da usabilidade, um arquivo ZIP é ainda melhor. Quem deseja clicar nas dez caixas de diálogo "Salvar como" que o navegador abrirá?
fonte
Eu concordo que um arquivo zip é uma solução mais limpa ... Mas se você tiver que enviar vários arquivos, aqui está a solução que encontrei. Funciona no IE 9 e superior (possivelmente uma versão inferior também - não testei), Firefox, Safari e Chrome. O Chrome exibirá uma mensagem ao usuário para obter sua concordância para baixar vários arquivos na primeira vez que seu site o usar.
O único efeito colateral dessa técnica é que o usuário verá um atraso entre o envio e a exibição da caixa de diálogo de download. Para minimizar este efeito, sugiro que você use a técnica descrita aqui e nesta questão Detectar quando o navegador recebe o download de um arquivo que consiste em definir um cookie com seu arquivo para saber se o download foi iniciado. Você terá que verificar esse cookie no lado do cliente e enviá-lo no lado do servidor. Não se esqueça de definir o caminho correto para o seu cookie ou você não o verá. Você também terá que adaptar a solução para download de vários arquivos.
fonte
Uma versão jQuery do iframe responde:
fonte
download(['http://nogin.info/cv.doc','http://nogin.info/cv.doc']);
No entanto, isso não funciona para baixar arquivos de imagem.Solução angular:
exemplo de trabalho: https://plnkr.co/edit/XynXRS7c742JPfCA3IpE?p=preview
fonte
Para melhorar a resposta de @Dmitry Nogin: isso funcionou no meu caso.
No entanto, não foi testado, já que não tenho certeza de como a caixa de diálogo de arquivo funciona em várias combinações de sistema operacional / navegador. (Assim, wiki da comunidade.)
fonte
Isso funciona em todos os navegadores (IE11, firefox, Edge, Chrome e Chrome Mobile). Meus documentos estão em vários elementos selecionados. Os navegadores parecem ter problemas quando você tenta fazer isso muito rápido ... Usei um tempo limite.
Esta é uma solução que usa promessas:
fonte
De longe a solução mais fácil (pelo menos no ubuntu / linux):
Funciona como um encanto.
fonte
Para resolver isso, criei uma biblioteca JS para transmitir vários arquivos diretamente em um zip no lado do cliente. A principal característica exclusiva é que não há limites de tamanho da memória (tudo é transmitido) nem formato zip (usa zip64 se o conteúdo for superior a 4 GB).
Uma vez que não faz compressão, também tem um ótimo desempenho.
Encontre "downzip" no npm ou no github !
fonte
O script a seguir fez esse trabalho perfeitamente.
fonte
Estou procurando uma solução para fazer isso, mas descompactar os arquivos em javascript não foi tão limpo quanto eu gostaria. Decidi encapsular os arquivos em um único arquivo SVG.
Se você tiver os arquivos armazenados no servidor (eu não), pode simplesmente definir o href no SVG.
No meu caso, converterei os arquivos em base64 e os incorporarei ao SVG.
Edit: O SVG funcionou muito bem. Se você vai apenas baixar os arquivos, o ZIP pode ser melhor. Se você vai exibir os arquivos, então o SVG parece superior.
fonte
Ao usar componentes Ajax, é possível iniciar vários downloads. Portanto, você deve usar https://cwiki.apache.org/confluence/display/WICKET/AJAX+update+and+file+download+in+one+blow
Adicione uma instância de AJAXDownload à sua página ou qualquer outra coisa. Crie um AjaxButton e substitua onSubmit. Crie um AbstractAjaxTimerBehavior e inicie o download.
Bom download!
fonte
Abaixo do código 100% funcionando.
Etapa 1 : colar o código abaixo no arquivo index.html
Etapa 2 : colar o código abaixo no arquivo index.js
NOTA : Certifique-se de que todos os três arquivos que vão baixar serão colocados na mesma pasta junto com os arquivos angularProject / index.html ou angularProject / index.js .
fonte
Obter lista de url com a chamada ajax e, em seguida, usar o plugin jquery para baixar vários arquivos paralelos.
fonte
É assim que eu faço isso. Abro vários ZIP mas também outro tipo de dados (exporto projeto em PDF e ao mesmo tempo muitos ZIPs com documento).
Acabei de copiar parte do meu código. A chamada de um botão em uma lista:
Portanto, uma chamada básica para uma rotina JS (regras Vanilla!). aqui está a rotina JS:
O truque é NÃO fornecer o link direto do arquivo ZIP, mas enviá-lo para o navegador. Como isso:
fonte
fonte