Em Javaweb, o upload e o download é uma função comum. Para upload de arquivo, o navegador passa o arquivo para o servidor no processo de carregar o arquivo em um processo de streaming. Geralmente, o pacote Commons-FileUpload é usado para implementar a função de upload. Como o Commons-FileUpload depende do pacote Commons-IO, você precisa baixar esses dois pacotes commons-FileUpload-1.2.1.jar e Commons-1.3.2.jar.
1. Construa um ambiente
Crie um projeto da web e importe o pacote para o projeto Lib
2. Implementar o upload do arquivo
(O primeiro método de upload)
Crie uma nova página do upload.jsp
<%@ página de página = "java" contentType = "text/html; charset = utf-8" pageEncoding = "utf-8"%> <! Doctype html public "-// w3c // dtd html 4.01 transitório // en" "http://www.w3.org/tr/html4/loose.dtd"><html> <head><meta http-equiv =" content-type "content =" text/html; charset = utf-8 "> <title> upload file </title> </head> Representa o caminho absoluto para o projeto, o que significa que, não importa para onde você copie o projeto no futuro, ele encontrará o caminho exato-> <formulário de ação = "<%= request.getContextPath ()%>/uploadservlet" Enctype = "Multipart/form-data" Method = "post"> <pan> Arquivo: </span> <input Type = "FILDE =" FILETE = "POST"> <nort> </span> </sput = " value = "upload"> </morm> </body> </html>
Crie um novo servlet que lida com o upload do arquivo
pacote com.load; importar java.io.file; importar java.io.ioException; importar java.util.list; importar javax.servlet.servletContext; import javax.servlet.portletexception; import javax.servlet.annotation.webslets; importletexception; importação; javax.servlet.http.httpServletReQuest; importar javax.servlet.http.httpServletResponse; importar org.apache.commons.fileupload.fileitem; import orgache.commons.fileUplOad.fileUploadex org.apache.commons.fileupload.disk.diskfileItemFactory; importar org.apache.commons.fileupload.servlet.servletfileUpload; @webServlet ("/uploadservlet") Public LongServlet Extndends httsVlett {privildServlet ") LongServlet LongSonstlet. public uploadServlet () {super (); } /* No pacote FileUpload, os elementos de formulário complexos na solicitação HTTP são considerados um objeto FileItem; * O objeto FileItem deve ser analisado pelo método parserequest () na classe servletfileUpload* (ou seja, o objeto httpServletRequest embalado), ou seja, o formulário de texto específico e o arquivo de uploads são separados. Método ismultipartContent (): Analise se existem solicitações nos arquivos na solicitação, boolean ismultipart = servletfileUpload.ismultipartContent (request); if (ismultipart) {// Crie um nó de disco liquidável fábrica de fábrica de discofileItemFactory Factory = new DiskFileItemFactory (); // Obtenha as informações de contexto da solicitação servletContext servletContext = request.getServletContext (); // diretório de cache, cada servidor específico do diretório repositório = (file) servletContext.getAttribute ("javax.servlet.context.tempdir"); // Defina o diretório de cache do servidor Factory.SetRepository (repositório); // A criação do objeto ServletFileUpload precisa depender do FileItemFactory // A fábrica salva o objeto FileItem de FileItem de FileItem de Upload para o disco rígido do servidor, ou seja, o objeto DiskFileItem. ServletfileUpload upload = new ServletFileUpload (fábrica); tente {// analisar o objeto HttpServletRequest após ser embrulhado, que é separar os formulários de texto e fazer upload de arquivos (as solicitações HTTP serão embrulhadas como httpServletRequest) list <FileItem> itens = upload.parseQuest (request); para (item de fileItem: itens) {string fieldName = item.getfieldName (); String filename = item.getName (); String contentType = item.getContentType (); boolean isinMemory = item.isinMemory (); sizeinbytes longos = item.getSize (); // instanciar um arquivo de arquivo // request.getRealPath (obtenha o arquivo de caminho real) arquivo = new File (request.getRealPath ("/")+"/carrega"+filename.substring (filename.lastIndexOF ("//")+1, filename.length ()); item.write (arquivo); }} catch (fileUploadexception e) {e.printStackTrace (); } catch (Exceção e) {e.printStackTrace (); }}} Void protegido doPost (solicitação httpServletRequest, httpServletResponse resposta) lança servletexception, ioexception {Doget (solicitação, resposta); }}(O segundo método de upload)
Crie uma nova página JSP (o mesmo que acima, apenas o caminho é alterado)
<%@ página de página = "java" contentType = "text/html; charset = utf-8" pageEncoding = "utf-8"%> <! Doctype html public "-// w3c // dtd html 4.01 transitório // en" "http://www.w3.org/tr/html4/loose.dtd"><html> <head><meta http-equiv =" content-type "content =" text/html; charset = utf-8 "> <title> upload file </title> </head> Representa o caminho absoluto para o projeto, o que significa que, não importa onde você copie o projeto no futuro, ele encontrará o caminho exato-> <formulário de ação = "<%= request.getContextPath ()%>/uploadServlet1" Enctype = "Multipart/form-data" Method = "post"> <span> Arquivo: </span> <input Type = "type =" FILDE ""> value = "upload"> </morm> </body> </html>
Crie servlet para lidar com upload
pacote com.load; importar java.io.file; importar java.io.fileOutputStream; importar java.io.ioException; importar java.io.inputStream; importar java.io.outputStream; importação javax.servlet.sertleTexception; import javax.servlet.annotation.multCon. javax.servlet.annotation.webServlet; importar javax.servlet.http.httpServlet; importar javax.servlet.http.httpServleTrequest; importar javax.servlet.http.httpsletlessonOnsion; javax.servlet.http.part; @webServlet ("/uploadservlet1")@multipartconfig (location = "") classe pública uploadServlet1 estende httpServlet {private static final long serialversionuid = 1L; public uploadServlet1 () {super (); } Void protegido Doget (solicitação httpServletRequest, resposta httpSertletResponse) lança servletexception, ioexception {Response.setContentType ("text/html; charset = utf-8"); request.setcharacterencoding ("UTF-8"); // Obtenha o arquivo de upload e leia a parte do arquivo na parte = request.getPart ("file1"); // Defina uma variável para receber o nome do arquivo string filename = null; // Content-Disposition: é para fornecer um nome de arquivo padrão quando o usuário deseja salvar o conteúdo solicitado como um arquivo // content-disposition: diga ao navegador para abrir o arquivo baixando para (String Content: Part.getheader ("Content-Disposition"). Split (";")) {System.out.Println (conteúdo); // obtenha o nome do arquivo se (content.trim (). StartSwith ("nome do arquivo")) {// intercepte o nome do arquivo filename = content.substring (content.indexof ('=') + 1) .trim (). Substituir ("/" ",");}} // outpulstren out = nul; // Linha de divisão do sistema e outros dados out FileOutputStream (novo arquivo (e:/carrega " + File.separator + nome do arquivo); Leia);(O terceiro método de upload)
O pacote JSPSMARTUPLOAD é usado aqui para fazer upload e download. O autor acredita que esse tipo de upload e download é relativamente simples, mas parece que muitas pessoas não o usam e não o entendem.
Crie a página HTML
<! Doctype html> <html> <head> <meta http-equiv = "content-type" content = "text/html; charset = utf-8"> <title> upload file </title> </head> <body> <p> </p> <p align = "center"> uplrogle file selet Action = "../ duploadservlet" ENCTYPE = "Multipart/form-data"> <tabela align = "Center"> <tr> <td> <div align = "Center"> 1. <input type = "file" name = "file1"> </div> </td> </tr> <tr> <t> <d align) </div> </td> </tr> <tr> <td> <div align = "center"> 3. <<input type = "file" name = "file3"> </div> </td> </tr> <tr> <td> <div align = "center"> <input type = "submit"/"/"/"> <t> <td> <Div ele" Centre "> <but type =" submit "/" subt = "> </morm> </body> </html>
Crie um servlet para processar arquivos de upload
package com.load;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.httpServletResponse; importar javax.servlet.jsp.jspFactory; importar javax.servlet.jsp.pageContext; import com.jspsmart.upload.file; import.jspsmart.upplOad.smarpLOPLO; com.jspsmart.upload.smartupploadexception; @webServlet ("/duploadservlet") classe pública DownloadServlet estende httpServlet {private estático final serialversionUiduid = 1L; public DownloadServlet () {super (); } Void protegido Doget (solicitação httpServletRequest, resposta httpSertletResponse) lança servletexception, ioexception {Response.setContentType ("text/html; charset = utf-8"); PrintWriter out = Response.getWriter (); // Crie um novo objeto de upload inteligente SmartUpload su = new SmartUpload (); / * * PageContext PageContext; Sessão HttpSession; Aplicativo ServletContext; Servletconfig config; Jspwriter fora; Página do objeto = this; Solicitação de HttpServletRequest, resposta HttpServLetResponse, onde o objeto, a solicitação e a resposta da página foram instanciados, enquanto os outros 5 objetos que não são instanciados são instantados da seguinte maneira PageContext = JSPXFactory.GetPaGecontext (isto, solicitação, resposta, nula, verdadeira, 8192,); */// Obtenha o ambiente de contexto através da classe JSP Factory PageContext PageContext = jspFactory.getDefaultFactory (). GetPageContext (isto, solicitação, resposta, nulo, true, 8192, true); // Carregar inicializar su.initialize (PageContext); // Faça o upload de arquivo tente {su.upload (); // Salvar o arquivo de upload no diretório especificado int count = su.save ("/share"); out.println (contagem+"upload de arquivo com sucesso! <br>"+su.toString ()); } catch (smartUploadexception e) {e.printStackTrace (); } // Extrair informações sobre o arquivo de upload um por um para (int i = 0; i <su.getfiles (). GetCount (); i ++) {arquivo file = su.getfiles (). GetFile (i); // se o arquivo não existir se (file.ismissing ()) continuar; // Mostrar informações atuais do arquivo out.println ("<tabela borda = 1>"); out.println ("<tr> <td> formulário nome do item (fieldname) </td> </td>"+file.getfieldName ()+"</td> </tr>"); out.println ("<tr> <td> comprimento do arquivo </td> <td>"+file.getSize ()+"</td> </tr>"); out.println ("<tr> <td> nome do arquivo </td> <td>"+file.getfilename ()+"</td> </tr>"); out.println ("<tr> <td> nome do arquivo </td> <td>"+file.getfilename ()+"</td> </tr>"); out.println ("<tr> <td> Extensão de arquivo </td> <td>"+file.getfileext ()+"</td> </tr>"); out.println ("<tr> <td> Nome completo do arquivo </td> <td>"+file.getFilePathName ()+"</td> </tr>"); out.println ("</tabela <br>"); }} / ** * @see httpServlet#DoPost (solicitação httpServletRequest, resposta httpServletResponse) * / DoPost nocivo protegido (httpServletRequest Solicy, httpServLePSOPSOnse) lança servleTexception, ioxception {/wdo Authdo AuthOs Response) lança servlexception, ioxception {/wdo Autho }} Nota: o código int conting = su.save ("/share"); Significa que você precisa criar uma pasta primeiro, para primeiro criar um no WebContent e depois desviar o projeto e, em seguida, reimpor -o, uma pasta será criada no lado da corrida!
Ou você pode encontrar diretamente o caminho para executar e criar a pasta de compartilhamento.
3. Realize o download do arquivo
(Download do primeiro arquivo)
Nota: Este código acessa diretamente a classe do servlet
pacote com.load; importar java.io.fileInputStream; importar java.io.ioException; importar java.io.inputStream; importar java.io.outputStream; importar javax.servlet.ervletexception; importação javax.servlet.annottle.webSertlet; importex. javax.servlet.http.httpServletRequest; importar javax.servlet.http.httpServletResponse; // use diretamente http: // lochost: 8080/test1/download para download, mas isso é defeituoso. Se houver chinês no nome do arquivo de download, ele ficará distorcido! @WebServlet ("/Download") Public Class Download Extende HttpServlet {private estático final serialversionuid = 1L; public Download () {super (); } Void protegido Doget (solicitação httpServletRequest, resposta httpSertletResponse) lança servletexception, ioexception {Response.setContentType ("text/plain; charset = utf-8"); Response.Setcharacterencoding ("UTF-8"); Response.setheader ("Localização", "Chinese.txt"); Response.setheader ("Content-Disposition", "Applement; FileName =" + "Account.txt"); OutputStream outputStream = Response.getOutputStream (); InputStream inputStream = new FileInputStream ("e:/carrega"+"/conta.txt"); byte [] buffer = novo byte [1024]; int i = -1; while ((i = inputStream.read (buffer))! = -1) {outputStream.write (buffer, 0, i); } outputStream.flush (); outputStream.Close (); } Void protegido doPost (solicitação httpServletRequest, resposta httpServletResponse) lança servletexception, ioexception {doget (solicitação, resposta); }}(O segundo método de download)
Crie uma nova página JSP e selecione Download
<%@ página de página = "java" contentType = "text/html; charset = utf-8" pageEncoding = "utf-8"%> <! Doctype html public "-// w3c // dtd html 4.01 transitório // en" "http://www.w3.org/tr/html4/loose.dtd"><html> <head><meta http-equiv =" content-type "content =" text/html; charset = utf-8 "> <title> Download </title> </órgão href = "../ DODOWNLOADSERVLETLE? nome do arquivo = hehe.txt"> clique para baixar </a> </body> </html>
Crie uma classe de servlet para baixar (Nota: Se o nome do arquivo deste download for chinês, ainda causará código ilegal)
pacote com.load; importar java.io.bufferedInputStream; importar java.io.file; importar java.io.fileInputStream; importar java.io.ioException; importar java.io.inutStream; import java.io.outputream; import.nlet.enet.urcentream; importem; javax.servlet.annotation.webServlet; importar javax.servlet.http.httpServlet; importar javax.servlet.http.httpServleTrequest; import javax.servlet.htttp.httpsSpSerPonsOnse; javax.servlet.jsp.pageContext; importar org.hsqldb.lib.stringUtil; importar com.jspsmart.upload.smartupload; imporownLownLOTNOVLOTNOTLOWN.UPLOAD.SMARTUPLOADEXCIMECT; {private estático final serialversionuid = 1L; public DODOwnLoadServlet () {super (); } Void protegido Doget (solicitação httpServletRequest, httpServletResponse Response) lança servletexception, ioexception {// obtenha o nome do arquivo baixado // string filename = request.getParameter ("filename"); // string filename = new String (filename.getBytes ("ISO8859-1"), "UTF-8"); // Crie um novo objeto SmartUpload SmartUpload su = new SmartUpload (); PageContext pageContext = jspFactory.getDefaultFactory (). GetPageContext (isto, solicitação, resposta, nulo, true, 8192, true); // Carregar a inicialização su.initialize (PageContext); // Definir proibição de abertura do arquivo su.setContentDisPoition (null); // Download Arquivo Try {su.downloadFile ("/ouvinte/"+nome do arquivo); } catch (smartUploadexception e) {// TODO BLOCO DE CATAGEM AUTOGERATION E.PRINTSTACKTRACE (); }} void protegido doPost (solicitação httpServletRequest, httpServletResponse resposta) lança servletexception, ioexception {doget (request, resposta); }}(O terceiro método de download)
O mesmo código de página JSP que acima não será repetido aqui.
Crie uma nova classe Serlvet para implementar a função de download (Nota: Mesmo que o nome do arquivo seja um nome chinês, não haverá problemas distorcidos!)
pacote com.load; importar java.io.bufferedInputStream; importar java.io.file; importar java.io.fileInputStream; importar java.io.ioException; importar java.io.inutStream; import java.io.outputream; import.nlet.enet.urcentream; importem; javax.servlet.annotation.webServlet; importar javax.servlet.http.httpServlet; importar javax.servlet.http.httpServleTrequest; import javax.servlet.htttp.httpsSpSerPonsOnse; javax.servlet.jsp.pageContext; importar org.hsqldb.lib.stringUtil; importar com.jspsmart.upload.smartupload; imporownLownLOTNOVLOTNOTLOWN.UPLOAD.SMARTUPLOADEXCIMECT; {private estático final serialversionuid = 1L; public DODOwnLoadServlet () {super (); } Void protegido Doget (solicitação httpServletRequest, httpServletResponse Response) lança servletexception, ioexception {// obtenha o nome do arquivo string path1 = request.getParameter ("nome do arquivo"); // Obtenha o caminho do caminho String path = request.getSession (). GetServletContext (). GetRealPath ("/ouvinte/"+path1); // O caminho é um arquivo emendado com base no caminho do log e no nome do arquivo. String filename = file.getName (); tente {// julgue se é IE11 sinalizador booleano = request.getheader ("user-agent"). indexof ("como gecko")> 0; // IE11 String de agente de usuário: mozilla/5.0 (Windows nt 6.1; wow64; trident/7.0; rv: 11.0) como gecko // ie6 ~ ie10 versão user-agent string: mozilla/5.0 (compatível; msie 10.0; windows nt 6.0; tridente/6.0) se (request.gEtheader ("user-agent"). tolowerCase (). indexOf ("msie")> 0 || sinalizador) {filename = urlencoder.encode (nome do arquivo, "utf-8"); // isto é, o número do número de spaces e o número de um número de spots e o que não se existe para o que não se existe para o que não é o que não se exporá o nome. // Este nome de arquivo é usado para o nome do arquivo exibido automaticamente na caixa de download do navegador FileName = new String (FileName.ReplaceAll ("", "") .GetBytes ("UTF-8"), "ISO8859-1"); // Firefox Browser // Firefox Browser User-Agent String: //mozilla/5.0 (Windows NT 6.1; Wow64; RV: 36.0) Gecko/20100101 Firefox/36.0} inputStream fis = new Bufferinputinputin (novo FileInputStream (Path)); buffer [] buffer; buffer = novo byte [fis.Available ()]; fis.read (buffer); fis.close (); Response.Reset (); Response.AddHeader ("Content-Disposition", "Applement; FileName =" +FileName); Response.addHeader ("Length-comprimento", "" + file.length ()); OutputStream OS = Response.getOutputStream (); Response.setContentType ("Application/Octet-Stream"); OS.WRITE (Buffer); // File de saída OS.flush (); os.close (); } catch (ioexception e) {e.printStackTrace (); } System.out.println (nome do arquivo); } Void protegido doPost (solicitação httpServletRequest, resposta httpServletResponse) lança servletexception, ioexception {doget (solicitação, resposta); }}O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.