Ideias básicas:
A idéia anterior era exibir uma caixa para perguntar ao usuário onde ele queria armazenar o arquivo e, em seguida, gerei outro arquivo e o coloquei lá. No entanto, minha ideia não teve sucesso.
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, uma tag <a>, href = "endereço do método de back-end". Se suas necessidades não puderem ser usadas diretamente no hiperlink, você pode escrevê -lo em JS
window.Location.href = "Endereço do método de back -end".
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á.
Exemplo
pacote cn.itcast.day06.web.servlet; importar java.io.ioException; importar java.io.inputStream; importar java.io.outputStream; importar java.net.urlencoder; importar javax.servlet.servletContext; importar javax.servlet.servletexception; importar javax.servlet.http.httpServlet; importar javax.servlet.http.httpSletRequest; import javox.sertlet.http.ttpstPSLEV; classe pública DownloadServlet estende httpServlet {public void Doget (solicitação httpServletRequest, httpServletResponse resposta) lança servletexception, ioexception {// implementar a função anti-tet-tet-cadeia // Obtenha o cabeçalho do referente a explicar o que o visitante vem do string referente = solicitação.GETHERERAER ("" if (referente == null ||! referent.startswith ("http: // localhost")) {// é um link ladrão Response.sendRedirect ("Day06/index.jsp"); retornar ; } // Resolva o problema da resposta chinesa resposta distorcida. // Defina a codificação do corpo da mensagem // O cabeçalho da mensagem de resposta HTTP enviado através do protocolo HTTP não pode aparecer em chinês chineses, os chineses devem ser o nome de string codificado por URL = urlencoder.encode ("beleza.jpg", "utf-8"); // notifique o navegador para ler o recurso Response.setheader ("Content-Disposition", "Applement; FileName ="+FileName); // Leia os dados da imagem e envie -os para o navegador do IE String webPath = "/download/beauty.jpg"; // equivalente ao caminho do aplicativo da web atual servletContext servletContext = super.getServletContext (); InputStream in = servletContext.GetResourCeasStream (WebPath); OutputStream out = Response.getOutputStream (); int len; byte [] buffer = novo byte [1024]; while ((len = in.read (buffer))! =-1) out.write (buffer, 0, len); } public void DoPost (solicitação httpServletRequest, httpServletResponse resposta) lança servletexception, ioexception {doget (solicitação, resposta); }}