1. Análise do princípio do upload de arquivo
1. Os pré -requisitos necessários para o upload de arquivo
um. O método do formulário deve ser postado
b. A propriedade Enctype do formulário deve ser do tipo multipart/formulário-dados.
Valor padrão do ENCTYPE: APLICAÇÃO/X-WWW-FORM-URLENCODED
Função: diga ao servidor para o tipo MIME do texto da solicitação
APLICATIVO/X-WWW-FORM-URLENCODED: Nome de usuário = ABC & Senha = 123
ServletRequest.getParameter (nome da string); Este método é um método que lê especificamente este tipo
Multipart/Form-Data:
2. Use o componente Commons-FileUpload para fazer upload de arquivos
um. Copie o pacote JAR: Commons-FileUpload.jar Commons-IO.jar
b. Princípio da implementação
3. Problema do código de lixo
um. Código de lixo de campos comuns
FileItem.getString (string charset); A codificação deve ser consistente com o cliente
b. O nome do arquivo chinês carregado é iluminado.
request.setcharacterencoding ("UTF-8"); A codificação deve ser consistente com o cliente
4. Implementação específica
O código para a recepção upload.jsp é o seguinte
<%@ Page Language = "java" import = "java.util.*" PageEncoding = "utf-8"%> <! content = "no-cache"> <meta http-equiv = "cache-control" content = "no-cache"> <meta http-equiv = "expira" content = "0"> <!-<link rel = "Stylesheet" type = "text/cs" href = "estilles.css"->->-</shead "</css" href = "estilles.css"->-> action = "$ {PageContext.Request.ContextPath}/servlet/uploadServlet3" Method = "post" Enctype = "Multipart/Form-Data"> Nome: <Nome de entrada = "Nome"/> <br/> FILE1: <input Type = "Nome =" F1 "/> <br/> type = "submite" value = "upload"> </mand> </body> </html>Código de servlet de fundo
pacote com.itheima.servlet; importar java.io.file; importar java.io.ioException; importar java.io.printwriter; importar java.io.usupportEdEncodingException; import java.util.list; import java.util.uuuid; javax.servlet.http.httpServlet; importar javax.servlet.http.httpServletRequest; importar javax.servlet.http.httpServletResponse; importação org.apache.commons.fileUpload.fileItem; org.apache.commons.fileupload.fileuploadbase; importar org.apache.commons.fileupload.fileuploadexception; importação org.apache.commons.fileUpload.disk.diskfileImatorMator; importação.Apachens.FileUpload.diskfiskfiskfiskFilePlor; org.apache.commons.io.filenameutils; // Explicação detalhada da classe pública uploadServlet3 estende HttpServlet {public void Doget (httpServleTrequest Solicy, httpServletResponse Response) lança servException, ioException {request.SetcharAcTerEncoding ("UTF-8"); Response.SetContentType ("text/html; charset = utf-8"); printWriter out = Response.getWriter (); System.out.print (requestRemoteaddr ()); boolean (); ServletFileUpload.isMultipartContent(request);if(!isMultipart){throw new RuntimeException("Please check the enctype property of your form to confirm that it is multipart/form-data");}DiskFileItemFactory dfif = new DiskFileItemFactory();ServletFileUpload parser = new ServletFileUpload(dfif);// parser.setFilesizEMAX (3*1024*1024); // Defina o tamanho de um único arquivo de upload // parser.SetSizEMAX (6*1024*1024); // Limite de tamanho total ao fazer o upload de vários arquivos Lista de arquivos <FileItem> itens = Null; tente {itens = = itens = parser.parserequest (request);} catch (fileUploadBase.FilesizELImitexEdEdException e) {out.Write ("uploadFile excede 3m"); return;} Catch (FileUploadBase.SizelImExEdEdException E); {E.PrintStackTrace (); lançar a nova execução de tempo de exceção ("o conteúdo do upload de análise falhou, tente novamente");} // Processe o conteúdo solicitado se (itens! = null) {for (fileItem item: itens) {if (item.isformfield ())) {ProcessFormField (item);} else {ProcessUPLOADField (item);}} saída.Irget ("}" " processuploadfield (item de fileItem) {tente {string filename = item.getName (); // if (filename! Filenameutils.GeTextension (nome do arquivo); // MIME TIPO STRING CONTENTTYPE = Item.getContentType (); if (contentType.startswith ("image/")) {// date agora = new Date (); // date df = new simplateformat ("yyyy-md-mdsnd (); Calcule o diretório de armazenamento de acordo com o código de hash do nome do arquivo String ChildDirectory = makechildDirectory (getServletContext (). GetRealPath ("/web-inf/files/"), nome do arquivo); storedirectorypath = childrtletContext (). Arquivo (StoredirectoryPath); if (! storedirectory.exists ()) {stororDirectory.mkdirs ();} system.out.println (nome do arquivo); ite (novo arquivo (storedirectoryPath+file.separator+nome do arquivo); Subdirectory Subdirectory Private String makechildDirectory (string realpath, string filename) {int hashcode = filename.hashcode (); int dir1 = hashcode & 0xf; // Take 1 ~ 4 bits string strin = (hashcode & 0xf0) >> 4/// Take 5 ~ 8 bits string File (realpath, diretório); if (! File.exists ()) file.mkdirs (); retornar diretório;} private void processField (fileItem item) {string fieldName = item.getFieldName (); // nome do campo string CampovValue; Try {FieldVe = Item.getString ("Utf-8"); RunTimeException ("A codificação UTF-8 não é suportada");} System.out.println (FieldName+"="+FieldValue);} public void DoPost (httpServleTrequest Solicy, httpsVletResponse Response) ThrowSception, ioOxception (Doget (Solictor,,, Solicpênsonse), resposta), isto, ioxception, {doget (Solicpê);5. Em relação a documentos temporários
um. DiskFileItemFactory
public void setrepository (repositório de arquivos): defina o diretório em que os arquivos temporários são armazenados.
b.
Ao fazer o upload de arquivos, use o fluxo de IO para processá -los você mesmo. Certifique -se de excluir o arquivo temporário após o fechamento do fluxo. FileItem.Delete ()
Recomenda -se usar: FileItem.Writer (arquivo f). Os arquivos temporários serão excluídos automaticamente.
6. Limite o tamanho do arquivo
um.
ServletfileUpload.setFilesizEMAX (3*1024*1024); // Defina o tamanho de um único arquivo de arquivo
b.
ServletFileUpload.SetSizEMAX (6*1024*1024); // Limite de tamanho total ao fazer upload de vários arquivos
O exposto acima é o código de exemplo para o arquivo de implementação do Commons FileUpload introduzido pelo editor. 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!