Requisitos: Implemente uma página da web com função de download de arquivos, baixando principalmente pacotes e imagens compactadas:
1: Download através do hiperlink
Em uma página HTML, link para o endereço do arquivo a ser baixado por meio de um hiperlink
<! Doctype html> <html> <head> <meta charset = "utf-8"> <title> Insira o título aqui </title> </head> <body> <h1> baixe arquivo através do link </h1> <a href = "/dia06/download/cors.zip"> </body> </html>
Onde Day06/Download é o caminho do documento, a estrutura do programa deste exemplo é a seguinte:
Após a execução do programa, você pode baixá -lo clicando no documento que precisa baixar.
Mas um problema aparecerá aqui, ou seja, quando você clicar para baixar o pacote compactado, a página de download será exibida, mas quando você baixar a imagem, o navegador abrirá diretamente a imagem e não há download.
Isso ocorre porque, ao baixar um arquivo através de um hiperlink, se o navegador puder reconhecer o formato do arquivo, o navegador abrirá diretamente. O download só será alcançado se o navegador não puder reconhecer o formato do arquivo. Portanto, o segundo método é usado para realizar a função de download.
2: Implementar o download através do programa servlet
O princípio de baixar arquivos através do Servlet é ler o programa de destino através do Servlet e retornar os recursos ao cliente.
<! Doctype html> <html> <head> <meta charset = "utf-8"> <title> Insira o título aqui </title> </head> <body> <h1> baixe arquivo através do link </h1> <a href = "/dia06/download/cors.zip"> <H1> Baixe o arquivo através do Programa de Servlet </h1> <a href = "/Day06/ServletDownload? FileName = cors.zip"> Pacote de compressão </a> <a href = "/Day06/ServletDownload? Filename = 1.png"> imagem </a> </body> </html>
Onde /Day06 /ServletDownload é o caminho de mapeamento do programa Servlet e, em seguida, crie um novo servlet, Name ServletDownload e o URL é mapeado para /ServletDownload.
Adicione o código da seguinte forma:
pacote com.lsgjzhuwei.servlet.Response; importar java.io.fileInputStream; importar java.io.fileOutputStream; importar java.io.ioException; importar java.io.inputStream; importar java.io.OutputStream; importar javax.servlet.servletexception; importar javax.servlet.annotation.webServlet; importar javax.servlet.http.httpServlet; importar javax.servlet.http.httpServletRequest; importar javax.servlet.http.httpServletResponse; /** * Classe de implementação do servlet servletDownload */@webServlet (assyncsupported = true, urlpatterns = {"/servletDownload"}) public class ServletDownload estende httpServlet {private static final long SerialVersionUid = 1l;; / ** * @see httpServlet#httpServlet () */ public ServletDownload () {super (); // TODO Construtor de auto-generado Stub}/** * @see httpServlet#Doget (solicitação httpServletRequest, httpServletResponse Response) */Protected Doget (httpServErQuest Solicy, httpsletResponse Response) Throwsceptionception (IOException (IoException (IoxertTeTrequest Solicy, httpsletResponse Response) sertleTexception) nome string filename = request.getParameter ("nome do arquivo"); System.out.println (nome do arquivo); // Defina o arquivo MIME TYPE A Response.SetContentType (getServletContext (). GetMimetype (nome do arquivo)); // Definir content-Disposition Response.setheader ("Content-Disposition", "Applement; filename ="+FileName); // Leia o arquivo de destino e escreva o arquivo de destino para o cliente através da resposta // Obtenha o caminho absoluto do arquivo de destino string fullfilename = getServletContext (). GetRealPath ("/download/" + nome do arquivo); //System.out.println(fullfilename); // Leia o arquivo inputStream em = new FileInputStream (FullFileName); OutputStream out = Response.getOutputStream (); // Write File int b; while ((b = in.read ())! = -1) {out.write (b); } in.close (); out.Close (); } / ** * @see httpServlet#doPost (solicitação httpServLeTrequest, httpServletResponse resposta) * / voce protegido DoPost (httpServleTrequest Solicy, httpServletResponse Response) lança servicexception, ioxception) Reinicie o servidor Tomcat para realizar o download de pacotes e imagens compactadas.
Três. Pontas:
A maneira de baixar arquivos é muito simples de clicar no link. O plano de fundo gera o fluxo de arquivos e realiza a função de download através do navegador, incluindo a investigação sobre localização e armazenamento de arquivos. A maioria dos navegadores configura um local fixo e pode não perguntar sempre.
O front-end é muito simples, com uma tag <a>, href = "endereço do método de back-end". Se suas necessidades não puderem ser usadas diretamente no modo de hiperlink, você poderá escrever window.location.href = "endereço do método de back -end" no JS.
Depois de pular para o método de fundo
String filepath = this.getClass (). GetClassLoader (). GetResource (""). Touri (). GetPath () + "/exportpdf.pdf"; // caminho do arquivo no arquivo do projeto outfile = new arquivo (filepath); String filename = outfile.getName (); // Obtenha o nome do arquivo inputStream fis = new bufferInputStream (new FileInputStream (filepath)); byte [] buffer = novo byte [fis.Available ()]; fis.read (buffer); // Leia o fluxo de arquivos fis.close (); Response.Reset (); // Redefina o resultado do conjunto de resultados.addHeader ("Content-Disposition", "Applement; filename =" + new String (filename.Replaceall ("", "". // retorna o nome do cabeçalho Response.addHeader ("Length-Length", "" + outfile.length ()); // retorna o tamanho do cabeçalho Response.SetContentType ("Application/Octet-Stream"); // Defina o tipo de dados // obtenha a saída do corpo de retorno corretamente outputStream OS = new BufferedOutputStream (Response.getOutputStream ()); OS.Write (Buffer); // File de saída OS.flush (); os.close (); O navegador reconhecerá diretamente este formulário de saída de arquivo e uma caixa de diálogo aparece.
Observe que este método deve ser ajustado em segundo plano usando o método de link. Não é possível usar métodos AJAX e XMLHTTPREQUEST. Dessa forma, o fluxo de arquivo retornado será retornado à função de retorno de chamada do método. Obviamente, se você deseja obter o arquivo no JS, isso funcionará.