Visão geral do upload do arquivo
Para realizar a função de upload de arquivos no desenvolvimento da Web, você precisa concluir as duas etapas a seguir:
Adicione a entrada de upload na página da web
Leia os dados do arquivo carregado no servlet e salve -os no disco rígido local.
Como adicionar itens de entrada de upload nas páginas da web?
A tag <input type = "arquivo"> é usada para adicionar itens de entrada de upload de arquivo na página da web. Você deve prestar atenção ao definir itens de entrada de upload de arquivo:
1. O atributo de nome do item de entrada de entrada deve ser definido, caso contrário, o navegador não enviará os dados do arquivo carregado.
2. O valor do formulário do Enctype deve ser definido como multipart/formulário-dados. Após definir esse valor, quando o navegador enviar o arquivo, ele anexará os dados do arquivo ao corpo da mensagem de solicitação HTTP e usará o protocolo MIME para descrever o arquivo carregado para facilitar o receptor para analisar e processar os dados enviados.
Visão geral do upload do arquivo
Como ler dados de upload do arquivo no servlet e salvá -los no disco rígido local?
O objeto de solicitação fornece um método getInputStream, através do qual os dados enviados pelo cliente podem ser lidos. No entanto, como os usuários podem fazer upload de vários arquivos ao mesmo tempo, é um trabalho muito problemático ler programaticamente os dados de upload diretamente no lado do servlet e analisar os dados de arquivo correspondentes separadamente, exemplos.
Para facilitar os usuários para processar dados de upload de arquivos, a organização de código aberto Apache fornece um componente de código aberto (Commons-FileUpload) usado para processar uploads de arquivo. Esse componente tem um excelente desempenho e sua API é extremamente simples de usar, permitindo que os desenvolvedores implementem facilmente funções de upload de arquivos da Web. Portanto, a função de upload de arquivos geralmente é implementada no desenvolvimento da Web, que geralmente é implementada usando o componente Commons-FileUpload.
Use o componente Commons-FileUpload para implementar o upload de arquivos e precisa importar os pacotes de suporte de suporte correspondentes para este componente: Commons-FileUpload e Commons-Io. O Commons-Io não pertence ao arquivo JAR de desenvolvimento para componentes de upload de arquivos, mas o componente Commons-FileUpload começa com a versão 1.1 e requer suporte do pacote Commons-IO quando funcionar.
Fluxo de trabalho do componente FileUpload
Core API - DiskFileItemFactory
DiskFileItemFactory é a fábrica que cria objetos FileItem. Métodos comuns para esta aula de fábrica:
Public void SetsizEThreshold (int sizethreshold): define o tamanho do buffer de memória, o valor padrão é 10k. Quando o arquivo de upload for maior que o tamanho do buffer, o componente FileUpload fará o upload do arquivo usando um cache de arquivo temporário.
public void setRepository (java.io.file repositório): especifique o diretório de arquivos temporários, o valor padrão é System.getProperty ("java.io.tmpdir").
public DiskFileItemFactory (int sizethreshold, java.io.file repositório): construtor
Core API - ServletFileUpload
ServletfileUpload é responsável pelo processamento de dados de arquivo carregado e encapsula cada item de entrada no formulário em um objeto FileItem. Os métodos comuns são:
Boolean ismultipartContent (solicitação httpServletRequest): determina se o formulário carregado é do tipo multipart/formulário
List Parserequest (solicitação httpServletRequest): analise o objeto de solicitação, envolva cada item de entrada no formulário em um objeto FileItem e retorne uma coleção de listas que salva todos os fileIitems.
SetfilesizEMAX (Long FileSizemax): Defina o valor máximo dos arquivos carregados
SetsizEMAX (Sizemax Long): Defina o valor máximo do número total de arquivos carregados
setheaderencoding (java.lang.string codificação): defina o formato de codificação
setProgressListener (ProgressListener Plistener)
Caso de upload de arquivo
Etapas de implementação
1. Crie um objeto DiskFileItemFactory, defina o tamanho do buffer e o diretório de arquivos temporários 2. Use o objeto DiskFileItemFactory para criar um objeto ServletFileUpload e defina o limite de tamanho para carregar arquivos.
3. Ligue para o ServletFileUpload.parserequest Método para analisar o objeto de solicitação e obter um objeto de lista que salva todos os conteúdos enviados.
4. Itera sobre a lista. Cada um itera um objeto FileItem e chama seu método ISFormField para determinar se é um arquivo carregado.
É um campo de formulário normal, depois ligue para os métodos GetFieldName e GetString para obter o nome do campo e o valor do campo
Para fazer upload de um arquivo, o método getInputStream é chamado para obter o fluxo de entrada de dados, lendo assim os dados enviados.
Codificação para implementar o upload de arquivo
Processando detalhes do upload de arquivos
Arquivo chinês Problema iluminado
O problema do nome do arquivo chinês ilegal, você pode chamar o método de SetheadeRencoding do servletupLoader ou definir a propriedade SetCharacterencoding da solicitação
Problema de exclusão de arquivos temporários
Como o tamanho do arquivo excede o tamanho do buffer de memória definido pelo método DiskFileItemFactory.SetSizETHreshold, o componente Commons-FileUpload usará um arquivo temporário para salvar os dados enviados. Portanto, no final do programa, chame o método FileItem.Delete para excluir o arquivo temporário.
A chamada para o método de exclusão deve estar após o fechamento do fluxo; caso contrário, ocorrerá o uso do arquivo, resultando na falha da exclusão.
Localização de armazenamento de arquivos
Para garantir a segurança do servidor, os arquivos enviados devem ser salvos no diretório da Web-Inf do aplicativo ou um diretório não gerenciado pelo servidor da Web.
Para impedir que vários usuários enviem arquivos com o mesmo nome de arquivo, resultando em sobrescrição de arquivos, o upload de arquivos deve garantir que o arquivo carregado tenha um nome de arquivo exclusivo.
Para evitar muitos arquivos em um único diretório e afetar a velocidade de leitura e escrita de arquivos, o programa que lida com arquivos de upload deve selecionar o algoritmo de geração de estrutura de diretório apropriado com base na quantidade total de possíveis uploads de arquivos e armazenar os arquivos enviados de maneira dispersa.
Download do arquivo
Como o arquivo a ser baixado pode ser de vários tipos, o arquivo deve ser transferido para o cliente e seu conteúdo correspondente deve ser processado como binário; portanto, o método deve ser chamado para retornar o objeto ServelTutputStream para gravar o conteúdo do arquivo no cliente.
Baixe o caso
Iterate através de todos os arquivos no diretório de upload e os exibe para o usuário e permite que o usuário preencha o download.
(Leia todos os arquivos em uma determinada pasta, salve-os na lista da coleção e salve-os no escopo da solicitação) ListFileServlt-(Mostrar todos os arquivos LIST) LISTFILES.JSP ---- Downloaservlet.javaprivate string id; private string saveName; // O nome do arquivo de upload, o nome UUID do arquivo private String realname; // o nome real do arquivo de upload Private String savepath; // Lembre -se da localização do arquivo de data de data de data privada; // o tempo de upload do arquivo Private String Descrição; // a descrição do nome de string privada de arquivo Nome de usuário; // o uploader listfileServletPackage com.hbsi.servlet; importar java.io.file; importar java.io.ioException; importar java.io.printwriter; import java.util.hashmap; import java.util.map; import javax.sertlet.sertletexception; javax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;public class ListFileServlet extendsHttpServlet {publicvoid doGet(HttpServletRequest request, HttpServletResponse Resposta) ThrowsServLetexception, ioException {stringSavePath = this.getServletContext (). getRealPath ("/web-inf/upload"); mapMap = new hashmap (); listfiles (newfile (savepath), map); request.setAttribute ("map", map); request.getRequestDispatcher ("/listfile.jsp"). forward (solicitação, resposta);} privateVoid listfiles (arquivo de arquivo, mapa mapa) {if (file.isfile ()) {stringuUidName = file.getName (); // uuid_a_1_3_3.txtstringRealName = uuidname.substring (uuidname.indexof ("_") + 1); map.put (uuidName,} nome); else} else {file [] file.listfiles (); para (file files) {files {list DoPost (httpServletReQuest Solicy, httpServletResponse Response) lança -servletexception, ioexception {doget (request, resposta);}} downloadservletpackage com.hbsi.ServLet; import java.io.file; import java.io.fileInStream; importestream; javA; java.io.printwriter; importar java.net.urlencoder; importar javax.servlet.servletexception; importar javax.servlet.http.httpServLet; importjavax.Servlet.htttp.httpletleTrequest; estendshttpServlet {publicVoid Doget (solicitação httpServletRequest, httpServletResponse resposta) ThrowsServletexception, ioexception {stringFilename = request.getParameter ("FileName"); filename = new String (filename.getBytes ("ISO8585"); "utf-8"); System.out.println (nome do arquivo); stringsavePath = this.getFileSavePath (this.getRealName (nome do arquivo)); filef = novo arquivo (salvAthath + "/" + filename); if (! f.exists ()) {request.setTribute ("message" "o download do download do download do download do download do download do download do download do download do download do download do download do atendimento (! existir "); request.getRequestDispatcher ("/message.jsp "). Forward (solicitação, resposta);} Response.SEtheader (" Content-Disposition "," Appion; FILENAME = "+ urlencoder.EncodSTerin (thisgetRealName (filename)," utf-8 "); FileInTreamin (FileName) (utf-8); byte [1024]; intlen = 0; outputStreamout = Response.getOutputStream (); while ((len = in.read (buf))> 0) {out.write (bufileSave, len);} em.close ();} publicstring getFileSaPhPath (string filename) / {intdir1 (FILENAME.HASHCODE () >> 4) & 0XF; stringSavePath = this.getServletContext (). getRealPath ("/web-inf/upload") + "//" + dir1 + "//" + dir2; returnSavePath;} publicstring getRealname (string filame) {stringReal FILENAME.SUBSTRING (FILENAME.INDEXOF ("_") + 1); ReturnRealName;} PublicVoid DoPost (solicitação HttpServletRequest, HttpServletResponse Response) lança -servletexception, IoException {Doget (Solicitação, resposta);}}