Ultimamente, tenho brincado com o WebGL e consegui um leitor Collada funcionando. O problema é que é muito lento (Collada é um formato muito detalhado), então vou começar a converter arquivos para um formato mais fácil de usar (provavelmente JSON). Eu já tenho o código para analisar o arquivo em JavaScript, então também posso usá-lo como meu exportador! O problema está salvando.
Agora, eu sei que posso analisar o arquivo, enviar o resultado ao servidor e solicitar que o navegador solicite o arquivo de volta do servidor como um download. Mas, na realidade, o servidor não tem nada a ver com esse processo específico, então por que envolvê-lo? Eu já tenho o conteúdo do arquivo desejado na memória. Existe alguma maneira de eu apresentar ao usuário um download usando JavaScript puro? (Eu duvido, mas é melhor perguntar ...)
E para ser claro: não estou tentando acessar o sistema de arquivos sem o conhecimento dos usuários! O usuário fornecerá um arquivo (provavelmente por meio de arrastar e soltar), o script transformará o arquivo na memória e o usuário será solicitado a baixar o resultado. Todas essas atividades devem ser "seguras" no que diz respeito ao navegador.
[EDIT]: Eu não mencionei isso de antemão, então os pôsteres que responderam "Flash" são válidos o suficiente, mas parte do que estou fazendo é uma tentativa de destacar o que pode ser feito com HTML5 puro ... então o Flash é bem no meu caso. (Embora seja uma resposta perfeitamente válida para qualquer pessoa que faça um aplicativo Web "real".) Nesse caso, parece que estou sem sorte, a menos que queira envolver o servidor. Obrigado mesmo assim!
fonte
Respostas:
OK, criando dados: o URI definitivamente faz o truque para mim, graças a Matthew e Dennkster apontando essa opção! Aqui está basicamente como eu faço isso:
1) coloque todo o conteúdo em uma string chamada "content" (por exemplo, criando-o inicialmente ou lendo innerHTML da tag de uma página já criada).
2) Crie o URI de dados:
Haverá limitações de comprimento, dependendo do tipo de navegador, etc., mas, por exemplo, o Firefox 3.6.12 funciona até pelo menos 256k. Codificar em Base64 em vez de usar encodeURIComponent pode tornar as coisas mais eficientes, mas para mim tudo bem.
3) abra uma nova janela e "redirecione" para este URI solicitando um local de download da minha página gerada por JavaScript:
É isso aí.
fonte
location.href
como o conteúdo.location.href = uriContent
.location.href = "data:application/octet-stream," + encodeURIComponent(jQuery('#answer-4551467 .post-text').first().text());
e ele salvará o conteúdo da resposta de @ Nøk em um arquivo. Não tenho o IE para testá-lo, mas funciona para o webkit.Solução simples para navegadores prontos para HTML5 ...
Uso
fonte
O HTML5 definiu um
window.saveAs(blob, filename)
método. Não é suportado por nenhum navegador no momento. Mas há uma biblioteca de compatibilidade chamada FileSaver.js que adiciona essa função aos navegadores mais modernos (incluindo o Internet Explorer 10+). O Internet Explorer 10 oferece suporte a umnavigator.msSaveBlob(blob, filename)
método ( MSDN ), usado no FileSaver.js para suporte ao Internet Explorer.Eu escrevi uma postagem no blog com mais detalhes sobre esse problema.
fonte
Salvando arquivos grandes
URIs de dados longos podem causar problemas de desempenho nos navegadores. Outra opção para salvar arquivos gerados no lado do cliente é colocar o conteúdo em um objeto Blob (ou Arquivo) e criar um link de download usando
URL.createObjectURL(blob)
. Isso retorna um URL que pode ser usado para recuperar o conteúdo do blob. O blob é armazenado dentro do navegador até que sejaURL.revokeObjectURL()
chamado no URL ou o documento que o criou seja fechado. A maioria dos navegadores da Web tem suporte para URLs de objetos , o Opera Mini é o único que não os suporta.Forçando um download
Se os dados forem texto ou imagem, o navegador poderá abrir o arquivo, em vez de salvá-lo no disco. Para fazer o download do arquivo ao clicar no link, você pode usar o
download
atributo No entanto, nem todos os navegadores da Web têm suporte para o atributo de download . Outra opção é usarapplication/octet-stream
como o tipo mime do arquivo, mas isso faz com que o arquivo seja apresentado como um blob binário que é especialmente hostil ao usuário se você não especificar ou não puder especificar um nome de arquivo. Consulte também ' Forçar a abrir o pop-up "Salvar como ..." aberto no link de texto, clique em pdf em HTML '.Especificando um nome de arquivo
Se o blob for criado com o construtor File, você também poderá definir um nome de arquivo, mas apenas alguns navegadores da Web (incluindo Chrome e Firefox) terão suporte para o construtor File . O nome do arquivo também pode ser especificado como argumento para o
download
atributo, mas isso está sujeito a várias considerações de segurança . O Internet Explorer 10 e 11 fornece seu próprio método, msSaveBlob , para especificar um nome de arquivo.Código de exemplo
fonte
msSaveBlob
para abrir a caixa de diálogo "Salvar como". Para outros navegadores, sua única opção é escolher manualmente "Salvar como" no menu de contexto do link de download.document.getElementById('link').href = url;
, seu código pode prosseguir e disparar o link usando o.click()
método do elementofonte
a.click
pelo código usandodocument.createEvent()
o Matěj Pokorný sugerido, ele funcionará no FF, mas não no IE. Eu não experimentei o Chrome.Dê uma olhada no Downloadify de Doug Neiner, que é uma interface JavaScript baseada em Flash para fazer isso.
fonte
HTML 5
banner e marque de acordo? Isso provavelmente atrairá os usuários que conhecem esse campo específico (ainda é uma multidão comparativamente pequena no momento, suponho). Tenho certeza de que isso pode ser feito no HTML 5, mas não sei como.Solução Simples!
Funciona em todos os navegadores modernos.
fonte
window.open()
. É irrelevante. Você pode usar esse método e forçá.click()
-lo, mas observe o tempo que o Firefox não gosta se você ligar.click()
antes de deixar o elemento anexar ao corpo.Você pode gerar um URI de dados . No entanto, existem limitações específicas do navegador.
fonte
"data:text/plain;charset=UTF-8,"+encodeURIComponent(text)
mas sim, o IE limita o tamanho dos URLs de dados a uma quantidade inutilizável e não os suporta para coisas comowindow.open(...)
iframes (eu acho).Eu usei o FileSaver ( https://github.com/eligrey/FileSaver.js ) e funciona muito bem.
Por exemplo, eu fiz essa função para exportar logs exibidos em uma página.
Você precisa passar uma matriz para a instanciação do Blob, então talvez eu não tenha escrito da maneira certa, mas funciona para mim.
Apenas no caso, tenha cuidado com a substituição: esta é a sintaxe para torná-la global, caso contrário, ela substituirá apenas a primeira que ele encontrar.
fonte
w.close();
após oexecCommand
Encontrei duas abordagens simples que funcionam para mim. Primeiro, usando um
a
elemento já clicado e injetando os dados do download. E segundo, gerando uma
elemento com os dados de download, executandoa.click()
e removendo-os novamente. Mas a segunda abordagem funciona apenas se invocada por uma ação de clique do usuário. (Alguns) Bloqueios de navegadorclick()
de outros contextos, como no carregamento ou acionados após um tempo limite (setTimeout).fonte
a
documento (possivelmente com"display:none"
), clicar nele e removê-lo.Aqui está um link para o método de URI de dados sugerido por Mathew, que funcionou no safari, mas não muito bem porque eu não consegui definir o tipo de arquivo, ele é salvo como "desconhecido" e, em seguida, tenho que ir lá novamente mais tarde e alterá-lo para para visualizar o arquivo ...
http://www.nihilogic.dk/labs/canvas2image/
fonte
Você pode usar localStorage. Este é o equivalente em HTML5 dos cookies. Parece funcionar no Chrome e Firefox, mas no Firefox, eu precisava enviá-lo para um servidor. Ou seja, testar diretamente no meu computador doméstico não funcionou.
Estou trabalhando em exemplos HTML5. Vá para http://faculty.purchase.edu/jeanine.meyer/html5/html5explain.html e role até o labirinto. As informações para reconstruir o labirinto são armazenadas usando localStorage.
Eu vim a este artigo procurando por HTML5 JavaScript para carregar e trabalhar com arquivos xml. É o mesmo que o antigo html e JavaScript ????
fonte
experimentar
Se você deseja baixar dados binários, veja aqui
Atualizar
2020.06.14 Eu atualizo o Chrome para 83.0 e acima A parada do snippet SO funciona (devido a restrições de segurança da sandbox ) - mas a versão JSFiddle funciona - aqui
fonte
Conforme mencionado anteriormente, a API do arquivo , juntamente com as APIs FileWriter e FileSystem, pode ser usada para armazenar arquivos na máquina do cliente a partir do contexto de uma guia / janela do navegador.
No entanto, existem várias coisas relacionadas às duas últimas APIs das quais você deve estar ciente:
Aqui estão exemplos simples de como as APIs são usadas, direta e indiretamente, em conjunto para fazer isso:
BakedGoods *
Usando as APIs File, FileWriter e FileSystem brutas
Embora as APIs FileSystem e FileWriter não estejam mais no caminho dos padrões, seu uso pode ser justificado em alguns casos, na minha opinião, porque:
Se "alguns casos" abrange os seus, no entanto, é para você decidir.
* BakedGoods é mantido por ninguém menos que esse cara aqui :)
fonte
Esse encadeamento foi inestimável para descobrir como gerar um arquivo binário e solicitar o download do arquivo nomeado, tudo no código do cliente sem um servidor.
O primeiro passo para mim foi gerar o blob binário a partir dos dados que eu estava salvando. Existem muitos exemplos para fazer isso para um único tipo binário, no meu caso, tenho um formato binário com vários tipos que você pode passar como uma matriz para criar o blob.
A próxima etapa é fazer com que o navegador solicite ao usuário que baixe esse blob com um nome predefinido.
Tudo o que eu precisava era de um link nomeado que eu adicionei no HTML5 que eu pudesse reutilizar para renomear o nome do arquivo inicial. Eu o mantive oculto, pois o link não precisa ser exibido.
A última etapa é solicitar ao usuário que baixe o arquivo.
fonte
Aqui está um tutorial para exportar arquivos como ZIP:
Antes de começar, existe uma biblioteca para salvar arquivos, o nome da biblioteca é fileSaver.js. Você pode encontrar esta biblioteca aqui. Vamos começar, Agora, inclua as bibliotecas necessárias:
Agora copie esse código e ele fará o download de um arquivo zip com um arquivo hello.txt com o conteúdo Hello World. Se tudo funcionar bem, isso fará o download de um arquivo.
Isso fará o download de um arquivo chamado file.zip. Você pode ler mais aqui: http://www.wapgee.com/story/248/guide-to-create-zip-files-using-javascript-by-using-jszip-library
fonte