No desenvolvimento do sistema de aplicativos da Web, as funções de upload e download de arquivos são funções muito usadas. Hoje, vamos falar sobre a implementação das funções de upload e download de arquivos no Javaweb.
Para upload de arquivo, o navegador envia o arquivo ao servidor na forma de um fluxo durante o processo de upload. É mais problemático se você usar diretamente o Servlet para obter o fluxo de entrada do arquivo carregado e analisar os parâmetros de solicitação nele. Portanto, geralmente é escolhido usar o Common-FileUpload, o componente de upload de arquivos da ferramenta de código aberto Apache. O pacote JAR do componente de upload do FileUpload comum pode ser baixado no site oficial do Apache, ou pode ser encontrado na pasta Lib de Struts. A função do upload do Struts é baseada nessa implementação. O Common-FileUpload depende do pacote Comum-Io, para que você também precise baixar este pacote.
1. Construção do ambiente de desenvolvimento
Crie um projeto FileUploadandDownload e adicione o pacote de jar do componente do componente do componente do componente do componente do componente do componente do Apache, conforme mostrado na figura abaixo:
2. Implementar o upload do arquivo
2.1. Página de upload de arquivos e página de promotos de mensagem
O código da página do upload.jsp é o seguinte:
<%@ Page Language = "Java" PageEncoding = "Utf-8"%> <! Doctype html> <html> <head> <title> upload de arquivo </title> </head> <body> <form action/"$ {pageContext.request.ContextPath}/) Usuário: <input type = "text" name = "nome de usuário"> <br/> Carregar o arquivo 1: <input type = "file" name = "file1"> <br/> Carregar o arquivo 2: <input type = "file" name = "file2"> <br/> <input Type = "subt =" submit "> </form> </body> </body> <body> <body> <brod/> [html] Exibir impressão de copiar simples? <%@ página de página = "java" pageEncoding = "utf-8"%> <!2.2. Processando servlets para uploads de arquivo
O código de uploadHandleServlet é o seguinte:
pacote me.gacl.web.controller; importar java.io.file; importar java.io.fileOutputStream; importar java.io.ioException; importar java.io.inputStream; importar java.util.list; importar javax.servlet.servletexception; importar javax.servlet.http.httpServlet; importar javax.servlet.http.httpServletRequest; importar javax.servlet.http.httpServletResponse; importar org.apache.commons.fileupload.fileitem; importar org.apache.commons.fileupload.disk.diskfileItemFactory; importar org.apache.commons.fileupload.servlet.servletfileUpload; public class UploadHandleServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //Get the saved directory of the uploaded file, store the uploaded file in the WEB-INF directory, and does not allow direct access from the outside world to ensure the security of the uploaded file String savePath = this.getServletContext (). getRealPath ("/web-inf/upload"); Arquivo de arquivo = novo arquivo (savePath); // julga se existe o diretório salvo do arquivo carregado if (! File.exists () &&! File.isdirectory ()) {System.out.println (SalvePath+"O diretório não existe, ele precisa ser criado"); // crie o diretório file.mkdir (); } // A mensagem solicita a string message = ""; tente {// use o componente de upload do arquivo Apache para lidar com etapas de upload de arquivo: // 1. Crie uma fábrica de fábrica DiskFileItemFactory DiskFileItemFactory Factory = new DiskFileItemFactory (); // 2. Crie um arquivo de upload de upload de arquivo servletfileUpload upload = new ServletFileUpload (Factory); // Resolva o upload chinês e o upload.setheadeRencoding ("UTF-8"); // 3. Determine se os dados enviados são os dados do formulário de upload if (! ServletfileUpload.ismultipartContent (request)) {// Obtenha retorno de dados da maneira tradicional; } // 4. Use o analisador ServletFileUpload para analisar os dados enviados. O resultado da análise retorna uma lista <FileItem>. Cada FileItem corresponde ao item de entrada de uma lista de formulários <FileItem> list = upload.parserequest (request); para (Item FileItem: List) {// Se os dados de um item de entrada normal estiverem encapsulados no arquivo if (item.isformfield ()) {string name = item.getfieldName (); // Resolva o problema chinês ilegal dos dados de itens de entrada ordinários String Value = item.getString ("UTF-8"); // valor = new String (value.getBytes ("ISO8859-1"), "UTF-8"); System.out.println (nome + "=" + valor); } else {// Se o item do arquivo encapsular o arquivo carregado // Obtenha o nome do arquivo carregado, string filename = item.getName (); System.out.println (nome do arquivo); if (nome do arquivo == null || filename.trim (). Equals ("")) {continue; } // Nota: Os nomes de arquivos enviados por diferentes navegadores são diferentes. Alguns navegadores enviam arquivos com caminhos, como: c: //b/1.txt, e alguns são apenas nomes de arquivos simples, como: 1.txt // processam a parte do caminho do nome do arquivo do arquivo uploado obtido, apenas a peça do nome do arquivo é retenção de nome do arquivo = 1 nome do arquivo (FILENAME.LASTIndexOf ("/ // Obtenha o fluxo de entrada do arquivo carregado no item inputStream em = item.getInputStream (); // Crie um arquivo de saída de arquivo FileOutputStream OUT = new FileOutputStream (SalvePath + "//" + FileName); // crie um buffer buffer buffer [] = novo byte [1024]; // A identificação de se os dados no fluxo de entrada foram lidos são int len = 0; // O fluxo de entrada é lido no loop de buffer, (len = in.read (buffer))> 0 significa que ainda existem dados em whingo (len = in.read (buffer))> 0) {// use fileOutputStream Output Stream para gravar os dados do buffer no diretório especificado (salvamento + "//" + filenMame) out.wer.wring; } // Fechar o fluxo de entrada em.close (); // Fechar o fluxo de saída fora.close (); // Exclua o arquivo temporário gerado ao processar o arquivo de upload item.delete (); message = "O upload do arquivo foi carregado com sucesso!"; }}}} catch (Exceção e) {message = "Falha no upload do arquivo!"; E.PrintStackTrace (); } request.setAttribute ("mensagem", mensagem); request.getRequestDispatcher ("/message.jsp"). Forward (solicitação, resposta); } public void DoPost (solicitação httpServletRequest, httpServletResponse resposta) lança servletexception, ioexception {doget (solicitação, resposta); }}Registre uploadHandleServlet no arquivo web.xml
</servlet> <Verlet-name> uploadHandleServlet </servlet-name> <Servlet-class> me.gacl.web.controller.uploadhandleServlet </servlet-cass> </servlet> <rut--mapping> <ar Servlet-name> uplo uplo uptletlet </servlet-name> <erl-Pattern> <ar Servlet-name> uploadHandleSletlet </Servlet> <erl-Pattern> <stern-Pattern>/servlet> uplo uplo uptletlet </sertlet> <erl-patningn> <erl-Pattern>/servlet> uplo uplo upload/u upLovertlet </sertlet> <erl-patnatnn> <erl-Pattern>/servlet> uplo uploadHandleSletlet </servlet> <url-patring> </servlet-mapping>
O efeito de operação é o seguinte:
Depois que o arquivo é enviado com sucesso, o arquivo carregado é salvo no diretório de upload no diretório Web-Inf, conforme mostrado na figura abaixo:
2.3. Detalhes do upload de arquivo
Embora o código acima possa fazer upload de arquivos com sucesso no diretório especificado no servidor, há muitos pequenos detalhes que precisam receber atenção na função de upload de arquivos. Os seguintes pontos devem receber atenção especial.
1. Para garantir a segurança do servidor, os arquivos de upload devem ser colocados em um diretório que não possa ser acessado diretamente pelo mundo exterior, como no diretório Web-Inf.
2. Para evitar a substituição de arquivos, um nome de arquivo exclusivo deve ser gerado para fazer upload do arquivo.
3. Para evitar que muitos arquivos apareçam em um diretório, você deve usar o algoritmo de hash para interromper o armazenamento.
4. O valor máximo dos arquivos carregados deve ser limitado.
5. Para limitar o tipo de arquivos enviados, ao receber o nome do arquivo carregado, determine se o nome do sufixo é legal.
Em resposta aos 5 problemas detalhados acima, vamos melhorar o uploadHandleServlet. O código aprimorado é o seguinte:
pacote me.gacl.web.controller; importar java.io.file; importar java.io.fileOutputStream; importar java.io.ioException; importar java.io.inputStream; importar java.util.list; importar java.util.uuid; importar javax.servlet.servletexception; importar javax.servlet.http.httpServlet; importar javax.servlet.http.httpServletRequest; importar javax.servlet.http.httpServletResponse; importar org.apache.commons.fileupload.fileitem; importar org.apache.commons.fileupload.fileuploadbase; importar org.apache.commons.fileupload.progressListener; importar org.apache.commons.fileupload.disk.diskfileItemFactory; importar org.apache.commons.fileupload.servlet.servletfileUpload; / ** * @className: uploadHandLeServlet * @Description: TODO (eu uso uma frase para descrever a função desta classe) * @Author: GARANTIR CANGLANG * @DATE: 2015-1-3 11:35:50 PM * */ Public Class uplroadHandHandLeTlet Extrends HtTPSletLe Servletexception, ioexception {// Obtenha o diretório salvo do arquivo carregado, armazene o arquivo carregado no diretório da web-inf e não permite o acesso direto do mundo exterior para garantir a segurança dos arquivos enviados String SortPath = this.getServletContext (). // O arquivo temporário gerado durante o upload é salvo pela string de diretório temppath = this.getServletContext (). GetRealPath ("/web-inf/temp"); Arquivo tmpfile = novo arquivo (temppath); if (! tmpfile.exists ()) {// crie um diretório temporário tmpfile.mkdir (); } // A mensagem solicita a string message = ""; tente {// use o componente de upload do arquivo Apache para lidar com etapas de upload de arquivo: // 1. Crie uma fábrica de fábrica DiskFileItemFactory DiskFileItemFactory Factory = new DiskFileItemFactory (); // Defina o tamanho do buffer da fábrica. Quando o tamanho do arquivo carregado excede o tamanho do buffer, um arquivo temporário será gerado e armazenado no diretório temporário especificado. Factory.SetSizETHreshold (1024*100); // Defina o tamanho do buffer como 100kb. Se não for especificado, o tamanho do buffer é de 10kb por padrão. // Defina o diretório de armazenamento do arquivo temporário gerado durante o upload da fábrica.setRepository (tmpfile); // 2. Crie um arquivo de upload de upload de arquivo servletfileUpload upload = new ServletFileUpload (Factory); // Ouça o upload do arquivo de progresso upload.setProgressListener (new ProgressListener () {public void update (pbytesread longo, pcOntentLength Lengtle, int arg2) {System.out.println ("Tamanho do arquivo é:" Tamanho " + pcontentLength +", atualmente processado: " + pbytesread); 14608, atualmente processado: 7367 O tamanho do arquivo é: 14608, atualmente processado: 11419 O tamanho do arquivo é: 14608, atualmente processado: 14608 */}}); // Resolva o upload chinês e o upload.setheadeRencoding ("UTF-8"); // 3. Determine se os dados enviados são os dados do formulário de upload if (! ServletfileUpload.ismultipartContent (request)) {// Obtenha retorno de dados da maneira tradicional; } // Defina o valor máximo do tamanho do arquivo único carregado, que está atualmente definido como 1024*1024 bytes, ou seja, 1MB upload.setFileSizEMAX (1024*1024); // Defina o valor máximo do número total de arquivos carregados, o valor máximo = a soma dos tamanhos máximos de vários arquivos carregados ao mesmo tempo, que atualmente está definido como 10MB upload.SetSizEMAX (1024*1024*10); // 4. Use o analisador ServletFileUpload para analisar os dados enviados. O resultado da análise retorna uma lista <FileItem>, cada fileItem corresponde ao item de entrada de uma lista de formulários <FileItem> list = upload.parserequest (request); para (Item FileItem: List) {// Se o FileItem encapsular os dados dos itens de entrada ordinários se (item.isformfield ()) {string name = item.getfieldName (); // Resolva o problema chinês ilegal dos dados de itens de entrada comuns, valor da sequência = item.getString ("UTF-8"); // valor = new String (value.getBytes ("ISO8859-1"), "UTF-8"); System.out.println (nome + "=" + valor); } else {// Se o arquivo encapsula o arquivo carregado // obtenha o nome do arquivo carregado, string filename = item.getName (); System.out.println (nome do arquivo); if (nome do arquivo == null || filename.trim (). Equals ("")) {continue; } // Nota: Os nomes de arquivos enviados por diferentes navegadores são diferentes. Alguns navegadores enviam nomes de arquivos com caminhos, como: c: //b/1.txt, enquanto alguns são apenas nomes de arquivos simples, como: 1.txt // processam a parte do caminho do nome do arquivo do arquivo uploado obtido, apenas a peça do nome do arquivo é retida o nome do arquivo = nome do arquivo. // Obtenha a extensão do arquivo carregado string fileExtName = filename.substring (filename.lastIndexof (".")+1); // Se você precisar limitar o tipo de arquivo carregado, poderá usar a extensão do arquivo para determinar se o tipo de arquivo carregado é LEGAL SYSTEM.OUT.PRINTLN ("A extensão do arquivo carregado é:"+FileExtName); // Obtenha o fluxo de entrada do arquivo carregado no item inputStream em = item.getInputStream (); // Obtenha o nome do arquivo salvo String saveFilename = makefilename (nome do arquivo); // Obtenha o arquivo salvar diretório string realSavePath = MakePath (saveFileName, savePath); // Crie um arquivo de saída de arquivo FileOutputStream Out = new FileOutputStream (RealSavePath + "//" + SAVEFILENAME); // crie um buffer buffer buffer [] = novo byte [1024]; // A identificação de determinar se os dados no fluxo de entrada foram lidos é int len = 0; // O fluxo de entrada é lido no buffer, (len = in.read (buffer))> 0 significa que ainda existem dados em whingo (len = in.read (buffer))> 0) {// use fileOutputStream Output Stream para gravar os dados do buffer no diretório especificado (saves + l "/" + filename) out.ite; } // Fechar o fluxo de entrada em.close (); // Fechar o fluxo de saída fora.close (); // Exclua o arquivo temporário gerado ao processar o arquivo de arquivo //item.delete (); message = "O upload do arquivo foi carregado com sucesso!"; }}} catch (fileUploadBase.FilesizELImitexEdEdException e) {E.PrintStackTrace (); request.setAttribute ("mensagem", "o valor máximo de um único arquivo é excedido !!!"); request.getRequestDispatcher ("/message.jsp"). Forward (solicitação, resposta); retornar; } catch (fileUploadbase.sizelimitexedEdException e) {e.printStackTrace (); request.setAttribute ("mensagem", "o tamanho total do arquivo carregado excede o valor máximo do limite !!!"); request.getRequestDispatcher ("/message.jsp"). Forward (solicitação, resposta); retornar; } catch (Exceção e) {message = "O upload do arquivo falhou!"; E.PrintStackTrace (); } request.setAttribute ("mensagem", mensagem); request.getRequestDispatcher ("/message.jsp"). Forward (solicitação, resposta); } /*** @method: makefilename* @Description: Gere o nome do arquivo do arquivo carregado, com o nome do arquivo como: uuid+ "_"+ o nome original do arquivo* @Anthor: 发官网* @param Filename O nome original do arquivo* @return uuid+ "_"+ the the the Filename* /filen /filen /filen /filen /filming* /fillen /string /fillen /string /fillen /string /string /fIlmen /fIlring /Film aNeil /FILDEM (FILHEIT) /fILEN /FILEIT /FILEIT /FILEIT) // Para evitar a sobrescrição de arquivos, um nome de arquivo exclusivo deve ser gerado para fazer upload do arquivo. Return uuid.randomuuid (). ToString () + "_" + nome do arquivo; } / *** Para impedir que muitos arquivos apareçam em um diretório, você precisa usar o algoritmo de hash para interromper o armazenamento* @Method: MakePath* @Description:* @Anthor: o string de string e o nome do arquivo string e o nome do arquivo******* @Anthor: o string string string string string string string stringam storge storge storage storage storge nome o nome do arquivo, gerar o diretório de armazenamento com base no nome do arquivo* @StoragePATHPATHPATHAMPARAMAPATHAMATAMATAMATAMATAMATEM* @Param Filename O nome do arquivo, gerar o diretório de armazenamento baseado no arquivo* @StoragePATHPAty savePath) {// Obtenha o valor HashCode do nome do arquivo, e o que você obtém é o endereço do nome do objeto String no nome da memória int hashcode = filename.hashcode (); int dir1 = hashcode & 0xf; // 0--15 int Dir2 = (HashCode & 0xf0) >> 4; // 0-15 // Construa um novo diretório de salvamento string dir = salvath + "//" + dir1 + "//" + dir2; // O arquivo upload/2/3 upload/3/5 // pode representar o arquivo e o arquivo de diretório File = new File (Dir); // se o diretório não existir se (! File.exists ()) {// crie o diretório file.mkdirs (); } retornar dir; } public void DoPost (solicitação httpServletRequest, httpServletResponse resposta) lança servletexception, ioexception {doget (solicitação, resposta); }}Depois de melhorar os cinco pequenos detalhes mencionados acima, nossa função de upload de arquivos foi relativamente completa.
3. Download do arquivo
3.1. Liste os recursos de arquivo fornecidos para baixar
Queremos fornecer os recursos do arquivo no sistema de aplicativos da Web aos usuários para download. Primeiro, precisamos ter uma página para listar todos os arquivos no diretório de arquivos carregado. Quando o usuário clicar no hiperlink do download do arquivo, ele será baixado e escreva um listfileServlet para listar todos os arquivos baixados no sistema de aplicativos da web.
O código do listfileServlet é o seguinte:
pacote me.gacl.web.controller; importar java.io.file; importar java.io.ioException; importar java.util.hashmap; importar java.util.map; importar javax.servlet.servletexception; importar javax.servlet.http.httpServlet; importar javax.servlet.http.httpServletRequest; importar javax.servlet.http.httpServletResponse; /** * @ClassName: ListFileServlet * @Description: List all downloaded files in the web system* @author: Guarante* @date: 2015-1-4 9:54:40 pm * */ public class ListFileServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Obtenha o diretório para fazer upload de arquivos string uploadFilePath = this.getServletContext (). GetRealPath ("/web-inf/upload"); // armazenando o nome do arquivo a ser baixado mapa <string, string> filenameMap = new hashmap <string, string> (); // Travessia recursivamente todos os arquivos e diretórios no diretório FilePath e armazenar o nome do arquivo do arquivo no arquivo de coleta de mapas (novo arquivo (uploadFilePath), filenameMap); // arquivo pode representar um arquivo ou um diretório // envia a coleção de mapa para a página listFile.jsp para exibição. request.getRequestDispatcher ("/listfile.jsp"). Forward (solicitação, resposta); } /*** @method: listFile* @Description: Travesse recursivamente todos os arquivos no diretório especificado* @Anthor: 光克* @Param File significa um arquivo e também representa um diretório de arquivo* @param mapa coleta do mapa que armazena nomes de arquivo* /public void File (arquivo de arquivo, mapa <string, string> mapa) {Map) { if (! file.isfile ()) {// liste todos os arquivos e diretórios nos arquivos do diretório arquivos [] = file.listfiles (); // Transferir arquivos [] Array para (Arquivo F: Arquivos) {// Recursive ListFile (F, Map); }} else { /*** Processe o nome do arquivo. O arquivo carregado é renomeado na forma de nome uuid_file. Remova a parte uuid_ do nome do arquivo file.getName (). Se o nome do arquivo for semelhante a: 9349249849-88343-8344_A_FAN_DAVI.AVI, então file.getName (). Substring (file.getName (). file.getName (). substring (file.getName (). Indexof ("_")+1); //file.getName () recebe o nome original do arquivo. Esse nome é único, por isso pode ser usado como chave. Realname é o nome processado. Pode ser repetido map.put (file.getName (), realname); }} public void DoPost (solicitação httpServletRequest, httpServletResponse resposta) lança servletexception, ioexception {doget (solicitação, resposta); }} Aqui falo brevemente sobre o método ListFile no ListFileServlet. O método ListFile é usado para listar todos os arquivos no diretório. O método ListFile usa a recursão. No desenvolvimento real, definitivamente criaremos uma tabela no banco de dados, que armazenará o nome do arquivo carregado e o diretório de armazenamento específico do arquivo. Podemos conhecer o diretório de armazenamento específico do arquivo, consultando a tabela e não há necessidade de usar operações de recursão. Este exemplo é porque o banco de dados não armazena o nome do arquivo carregado e o local de armazenamento específico do arquivo, e o local de armazenamento do arquivo carregado é usado para interromper o armazenamento, de modo que a recursão é necessária. Durante a recursão, o nome do arquivo obtido é armazenado na coleção de mapas passada de fora para o método ListFile, para que possamos garantir que todos os arquivos sejam armazenados na mesma coleção de mapas.
Configurar listfileServlet no arquivo web.xml
<servlet> <servlet-name>ListFileServlet</servlet-name> <servlet-class>me.gacl.web.controller.ListFileServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ListFileServlet</servlet-name> <url-pattern>/servlet/ListFileServlet</url-pattern> </servlet-mapping>
A página listfile.jsp exibindo o arquivo baixado é o seguinte:
<%@ página de página = "java" import = "java.util.*" pageEncoding = "utf-8"%> <%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core"%> <! <!-Coleção de mapa Traverse-> <c: foreach var = "me" itens = "$ {filenameMap}"> <c: url value = "/servlet/downloadservlet" var = "downurl"> <c: param name = "filename" href = "$ {Downurl}"> Download </a> <br/> </c: foreach> </body> </html> Ao acessar o ListFileServlet, você pode exibir os recursos de arquivo fornecidos aos usuários para baixar na página listfile.jsp, conforme mostrado na figura abaixo:
3.2. Implementar o download do arquivo
Escreva um servlet para downloads de arquivos de processamento. O código do downloadservlet é o seguinte:
pacote me.gacl.web.controller; importar java.io.file; importar java.io.fileInputStream; importar java.io.ioException; importar java.io.OutputStream; importar java.net.urlencoder; importar javax.servlet.servletexception; importar javax.servlet.http.httpServlet; importar javax.servlet.http.httpServletRequest; importar javax.servlet.http.httpServletResponse; classe pública Download doadLevlet estende httpServlet {public void Doget (httpServletRequest Solicy, httpServletResponse resposta) lança servletexception, ioexception {// Obtenha o nome do arquivo a ser baixado string filename = request.getParameter ("FILENAME"); //23239283-92489-avatar.avi filename = new String (filename.getbytes ("ISO8859-1"), "UTF-8"); // Os arquivos carregados são salvos no subdiretório do diretório/web-inf/upload string filesaverootPath = this.getServletContext (). GetRealPath ("/web-inf/upload"); // Descubra o diretório em que o arquivo está localizado pelo nome do arquivo String Path = findFileSavePathbyFilename (nome do arquivo, fileSaveotPath); // Obtenha o arquivo a ser baixado arquivo de arquivo = novo arquivo (caminho + "//" + nome do arquivo); // se o arquivo não existir se (! File.exists ()) {request.setAttribute ("mensagem", "o recurso que você deseja baixar foi excluído !!"); request.getRequestDispatcher ("/message.jsp"). Forward (solicitação, resposta); retornar; } // Processando o nome do arquivo string realname = filename.substring (filename.indexof ("_")+1); // Defina o cabeçalho da resposta para controlar o navegador para baixar o arquivo Response.setheader ("Content-Disposition", "Applement; FileName =" + Urlencoder.Encode (RealName, "UTF-8")); // Leia o arquivo a ser baixado e salve no arquivo de entrada FileInputStream in = new FileInputStream (Path + "//" + FileName); // Crie o fluxo de saída outputStream Out = Response.getOutputStream (); // Crie o buffer buffer buffer [] = novo byte [1024]; int len = 0; // loop Leia o conteúdo do fluxo de entrada no buffer while ((len = in.read (buffer))> 0) {// emitir o conteúdo do buffer para o navegador para realizar o arquivo download.Write (buffer, 0, len); } // Fechar o fluxo de entrada do arquivo em.close (); // Fechar o fluxo de saída fora.close (); } /*** @method: findFileSavePhbyFilename* @Description: Encontre o caminho do arquivo a ser baixado através do nome do arquivo e do diretório raiz de armazenamento* @Anthor: 发官网* @param arquivo nome do arquivo a ser baixado* @param saverotpath o diretório de root para que você use o arquivo, que é, / FindFileSavePathbyFilename (String FileName, String SaverOotPath) {int hashcode = filename.hashcode (); int dir1 = hashcode & 0xf; // 0--15 int Dir2 = (HashCode & 0xf0) >> 4; // 0-15 String dir = saverootPath + "//" + dir1 + "//" + dir2; // upload/2/3 upload/3/5 arquivo de arquivo = novo arquivo (dir); if (! file.exists ()) {// crie diretório file.mkdirs (); } retornar dir; } public void DoPost (solicitação httpServletRequest, httpServletResponse resposta) lança servletexception, ioexception {doget (solicitação, resposta); }}Configurando o downloadservlet no arquivo web.xml
<Verlet> <Verlet-name> DownloadServlet </Servlet-Name> <Servlet-Class> me.gacl.web.controller.downloadServlet </servlet-class> </servlet> <verl-mapping> <sutletname> DownloadServlet <//urn-tattern>/servlettlet/download/servletlet> servlettlet </servlet>/servlettlet/servletlet/servlettlet> <ervletname> download>
Clique no [Download] Hyperlink, envie a solicitação ao DownloadServlet e processe -o para obter o download do arquivo. O efeito de operação é mostrado na figura abaixo:
A partir dos resultados em execução, podemos ver que nossa função de download de arquivos pode baixar arquivos normalmente.
O acima é a explicação mais detalhada dos exemplos de upload e download de arquivos introduzidos pelo editor (recomendado). Espero que seja útil para todos. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a todos a tempo. Muito obrigado pelo seu apoio ao site wulin.com!