Os exemplos deste artigo compartilham com você a tecnologia de upload de arquivos Java para sua referência. O conteúdo específico é o seguinte
Forma:
O cliente deve usar o tipo de dados multipart/formulário para representar o tipo de dados composto ao enviar HTTP. Agora mesmo:
Use tags HTML no formulário.
Pacote necessário:
Commons-FileUpload.jar, a ferramenta de arquivo de upload do núcleo está neste pacote.
Pacote Commons-io.jar necessário para fazer upload de arquivos
Explicação detalhada do upload da classe de arquivo:
DiskFileItemFactory - Crie um diretório de arquivos de monitoramento temporal, que se refere ao tamanho da área de cache
ServletFileUpload é usado para analisar httpServletRequest. Retorna um conjunto de objetos de arquivo.
O FileItem representa cada objeto de arquivo carregado pelo usuário.
<%@ Page Language = "Java" import = "java.util.*" PageEncoding = "utf-8"%> <! placa-compreenda a camada subjacente </font> <!-multipart/form-data: multipart (não apenas arquivos, mas também partes)-> <form action = "<%= request.getContextPath ()%>/upload0" método = "post" names "") "FILE") "FILTE" FILTE "NOME" ") <!-O nome do arquivo carregado não pode estar em chinês; caso contrário, o nome do arquivo obtido é interrompido, mas o exemplo a seguir pode resolver esse problema-> </morm> <br/> <font color = "Red" size = "6"> Use a ferramenta de upload de arquivos Apache para obter upload de arquivo </font> <! method="post" enctype="multipart/form-data"> File:<input type="file" name="file"/> <input type="submit" value="upload"/> </form> <font color="red" size="6">Use the apache file upload tool to achieve file upload 2 (solve the garbled file name)</font> <p> POST1 (normal form): ENCTYPE = APLICATIVO/X-WWW-FORM-URLENCODADO (VALOR PADRÃO) </P> <P> POST2 (FORMULÁRIO DE ARQUIVO DE AGRADEIRA): ENCTYPE = Multipart/Form-Data: Multipart (não apenas arquivos, mas também partes) </p> <form Action = "<%= request.getCextPath ()/UPLOUPLE) type = "arquivo" name = "arquivo"/> <!-post2 (upload de arquivo de arquivo)-> <br/> Descrição do arquivo: <input type = "text" name = "desct"/> <!-post1 (formulário normal)-> <br/> Arquivo 2: <input type = "file" name = "file"/> <br/> <br/>) Arquivo 2: <input type = "file" name = "arquivo"/> <br/> Arquivo Descrição 2: <input type = "text" name = "desct"/> <input type = "submit" value = "upload"/> </morm> <font color = "vermelho" size = "6"> use a ferramenta de upload do arquivo Apache para atingir o arquivo up do FILHO (FILHO) (FILHO) </Arquivo) </Arquivo "</" Red "Size =" 6 "> Use o Feol da Fent Apache! form): Enctype = Application/X-Www-Form-Urlencoded (Valor padrão)-> <!-Post2 (Formulário de arquivo de upload): ENCTYPE = Multipart/Form-Data: Multipart (não apenas arquivos, mas também partes)-> <form Action = "<%= requestContetPath ()%>/upload3" Métod. type = "file" name = "file"/> <!-post2 (upload do arquivo de arquivo)-> <br/> Descrição do arquivo: <input type = "text" name = "desct"/> <!-post1 (formulário normal)-> <br/> <br/> arquivo 2: <input type = "file =" ""/> <br/>) value = "upload"/> </morm> </body> </html>
Compreendendo a camada inferior da placa de transição
package cn.hncu.servlet;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.httpServletRequest; importar javax.servlet.http.httpServletResponse; classe pública upload0Servlet estende httpServExtLeex {public void DoPost (httpSleTreQuest Solicution, hTTtTesembEnsonsonsOnsion). in = request.getInputStream (); BufferErader BR = new BufferredReader (new InputStreamReader (in)); Linha de string; while ((line = Br.readline ())! = null) {System.out.println (line); }}}Use a ferramenta de upload de arquivos Apache para implementar o upload de arquivo
package cn.hncu.servlet;import java.io.File;import java.io.IOException;import java.io.PrintWriter;import java.util.List;import java.util.UUID;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import 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; importação de serviços de serviço (serevlets. HttpServletResponse resposta) lança servletexception, ioexception {Response.setContentType ("text/html"); PrintWriter out = Response.getWriter (); out.println ("<! doctype html public/"-// w3c // dtd html 4.01 transitório // en/">"); out.println ("<html>"); out.println ("<head> <title> um servlet </ititle> </ad Head>"); out.println ("<body>"); out.print ("não suporta o upload ...". "); out.println ("</body>"); out.println ("</html>"); out.flush (); out.Close (); } public void DoPost (solicitação httpServletRequest, resposta httpServletResponse) lança servletexception, ioexception {// no servidor, especifique um diretório para todos os arquivos uploados string path = getServletContext (). getRealpath ("/upload"); System.out.println ("Path:"+Path); Arquivo dir = novo arquivo (caminho); if (! Dir.Exists ()) {Dir.mkdirs (); } // Crie uma fábrica baseada em disco rígido // diskFileItemFactory Disk = new DiskFileItemFactory (); // Definir diretório temporário (recomenda -se projetar um diretório temporário, caso contrário, o diretório temporário do sistema será usado.) //Disk.setRepository(New File ("d:/a")); // 3. Defina o tamanho do buffer para escrever dados no disco rígido. // Quando o arquivo for maior que essa configuração, um arquivo temporário será formado no diretório temporário // Defina o tamanho do buffer de arquivo temporário-8K buffer, endereço temporário endereço discofileItemFactory f = new DiskFileItemFactory (1024*8, novo arquivo ("d:/a")); // Ferramenta de upload-crie um objeto para analisar o servletfileUpload upload = new ServletfileUpload (f); upload.setFilesizEMAX (1024*1024*5); // Defina o arquivo único máximo de upload como 5m // Defina o tamanho máximo do arquivo carregado. Se forem vários arquivos, é a soma de vários arquivos de até 8m upload.SetSizEMAX (1024*1024*8); // Defina a soma de todos os tamanhos de arquivo carregados até 8m // Use a ferramenta de análise para analisar tentativa {list <FileItem> list = upload.parserequest (request); Para (FileItem Fi: List) {System.out.println ("Tipo de conteúdo do arquivo:"+fi.getContentType ()); // Tipo de conteúdo do arquivo: text/sloth System.out.println ("Nome do arquivo:"+fi.getname (); ext = fi.getName (). substring (fi.getName (). lastIndexOf (".")); //. String filename = uuid+ext; // fileutils.copyInputStreamTofile (fi.getInputStream (), novo arquivo ("d: //d/a.txt"); // escrevê -lo morto // fi.getInputStream () é o arquivo real FileUtils.CopyInSTreamTofile (fi. Arquivo (caminho+"/"+nome do arquivo)); // grava viva}} catch (fileUploadexception e) {e.printStackTrace (); }}} Armazenar arquivos carregados neste lugar
Faça o upload de informações:
Carregar resultados:
Use a ferramenta de upload do arquivo Apache para obter o upload do arquivo 2 (resolva o nome do arquivo ilegível)
package cn.hncu.servlet;import java.io.File;import java.io.IOException;import java.io.PrintWriter;import java.util.List;import java.util.UUID;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import 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;import org.apache.commons.fileupload.servlet.ServletFileUpload;import org.apache.commons.io.FileUtils;public class Upload2Servlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse resposta) lança servletexception, ioexception {Response.setContentType ("text/html"); // Se for um formulário que contém arquivos enviados (post2), o drama pode definir apenas a codificação no nome do arquivo do arquivo carregado (resolva seu código lisonjeado chinês) //, mas não pode resolver o código lhado chinês de componentes de formulário comum no modo Post2 PrintWriter Out = Respons.getWriter (); out.println ("<! doctype html public/"-// w3c // dtd html 4.01 transitório // en/">"); out.println ("<html>"); out.println ("<head> <title> um servlet </ititle> </ad Head>"); out.println ("<body>"); out.print ("não suporta o upload ...". "); out.println ("</body>"); out.println ("</html>"); out.flush (); out.Close (); } public void DoPost (solicitação httpServletRequest, resposta httpSertletResponse) lança servletexception, ioexception {// etapa 1 // formulário comum (pós-1), a seguinte sentença pode definir o pedido do conteúdo do componente comum (pode resolver seu problema chinês). // Se for um formulário que contém arquivos carregados (post2), esta frase pode definir apenas a codificação no nome do arquivo do arquivo carregado (resolva seu código ilegal chinês). Mas ele não pode resolver o código distorcido do componente do formulário comum (não pode definir sua codificação) // no servidor, especifique um diretório para todos os arquivos carregados String path = getServletContext (). GetRealPath ("/upload"); System.out.println ("Path:"+Path); Arquivo dir = novo arquivo (caminho); if (! Dir.Exists ()) {Dir.mkdirs (); } // Defina o tamanho do buffer de arquivo temporário-8K buffer, endereço temporário do arquivo DiskFileItemFactory f = new DiskFileItemFactory (1024*8, novo arquivo ("d:/a")); // upload da ferramenta servletfileUpload upload = new ServletFileUpload (f); upload.setFilesizEMAX (1024*1024*5); // Defina o arquivo único máximo de upload como 5m upload.SetSizEMAX (1024*1024*8); // Defina a soma de todos os tamanhos de arquivo enviados como 8m // Use a ferramenta de análise para analisar experimente {list <FileItem> list = upload.parserequest (request); para (fileItem fi: list) {if ((fi.isformfield ())) {// se for um componente de formulário normal: caixa de seleção, rádio, senha ... // string desc = fi.getString (); System.out.println ("fi.getString ():"+fi.getString ()); // Segunda etapa string desc = fi.getString ("UTF-8"); // Esta frase define a codificação de conteúdo do componente de forma comum System.out.println ("Após a codificação:"+desc); } else {string ext = fi.getName (). substring (fi.getName (). lastIndexof (".")); //. txt string uuid = uuid.randomuuid (). String filename = uuid+ext; //fi.getInputStream () é a informação real do arquivo fileUtils.copyInputStreamTofile (fi.getInputStream (), new File (Path+"/"+FileName)); // Escreva vivo}}}} Catch (fileUploadexception e) {E.PrintStackTrace (); }}}Faça o upload de informações:
Carregar resultados:
Use a ferramenta de upload do arquivo Apache para obter o upload do arquivo 3 (quebra de arquivo)
Otimize o armazenamento de arquivos com o diretório de hash:
O diretório de hash é um método para otimizar o desempenho do armazenamento de arquivos. Seja Windows ou Linux, seja NTFS ou EXT3, o número de itens que podem ser acomodados em cada diretório é limitado.
Não é que não possa ser salvo, mas quando o número de projetos é muito grande, a velocidade de indexação de arquivos será reduzida.
Portanto, é necessário pesar quantos arquivos devem ser salvos em um diretório. Economizar muito afetará o desempenho, embora economizar muito pouco causará muitos diretórios e desperdício de espaço. Então, ao salvar grandes lotes de arquivos,
Há um algoritmo que pode "quebrar" arquivos de maneira mais uniforme em diferentes subdiretos para melhorar a velocidade do índice de cada nível. Este algoritmo é hash. O MD5, SHA1, etc. comumente usado como diretório de hash. O MD5 também é usado na minha sessão para obter o primeiro e o nono dígitos do SessionID, que constitui um caminho de hash de dois níveis. Ou seja, o sistema distribui todos os arquivos de sessão para 16 × 16 = 256 subdiretos. Supondo que a economia de 1000 arquivos em cada diretório do Linux possa atingir a melhor taxa de desempenho do espaço, o sistema pode idealmente ter 256.000 arquivos de sessão sendo usados ao mesmo tempo.
package cn.hncu.servlet;import java.io.File;import java.io.IOException;import java.io.PrintWriter;import java.util.List;import java.util.UUID;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.httpServletReQuest; importar javax.servlet.http.httpServletResponse; importar org.apache.commons.fileupload.fileitem; import orgache.commons.fileUplOad.fileUploadex org.apache.commons.fileupload.progressListener; importar org.apache.commons.fileupload.disk.diskfileItemFactory; importar org.apache.common.fileupload.serv.servletFileUplOad; import.Apache.commOlmOmot.Fommot.FOMLOT.ILOT.IORSTONSOLOT.IORSTOLOT.ORTONSOT.IORSTOLOT.ORTONSOT.IORSTOLOT.ILOT.ILOT.ILOT.ILOT.ILOT.ILOT.ILOT.ILOT.ILOT.ILOT.ILOTSOLOAD; HttpServlet {public void Doget (solicitação httpServletRequest, httpServletResponse) lança servletexception, ioexception {Response.setContentType ("text/html"); // Se for um formulário que contém arquivos enviados (post2), o drama pode definir apenas a codificação no nome do arquivo do arquivo carregado (resolva seu código lisonjeado chinês) //, mas não pode resolver o código lhado chinês de componentes de formulário comum no modo Post2 PrintWriter Out = Respons.getWriter (); out.println ("<! doctype html public/"-// w3c // dtd html 4.01 transitório // en/">"); out.println ("<html>"); out.println ("<head> <title> um servlet </ititle> </ad Head>"); out.println ("<body>"); // Obtenha a parte após o "?" número no URL no método get // http: // localhost: 8080/servletDemo3/upload? nome = jack & sexo = string masculina qstr = request.getQueryString (); System.out.println ("QSTR:"+QSTR); // QSTR: NOME = Jack & Sex = masculino out.print ("Não suporta obter upload .... ..."); out.println ("</body>"); out.println ("</html>"); out.flush (); out.Close (); } public void DoPost (solicitação httpServletRequest, resposta httpSertletResponse) lança servletexception, ioexception {Response.setContentType ("text/html; charset = utf-8"); PrintWriter out = Response.getWriter (); // 1 Anti-Black: O front-end da proteção é enviado usando o método Post1 // Método 1 /* String Type = request.getContentType (); if (! type.contains ("multipart/form-data")) {out.println ("submissão de formulário não suportada"); retornar; }*/// Método 2 boo boolean = servletfileUpload.ismultipartContent (solicitação); if (! boo) {out.println ("envio de formulário não suportado"); retornar; } // Etapa 1 // Formulário Ordinário (Post1), a frase a seguir pode definir a codificação do conteúdo do componente do formulário comum (pode resolver seu problema chinês ilegal) request.SetcharacterEncoding ("UTF-8"); // Se for um formulário que contém arquivos carregados (post2), esta frase pode definir apenas a codificação no nome do arquivo do arquivo carregado (resolva seu código ilegal chinês). Mas ele não pode resolver o código distorcido do componente do formulário comum (não pode definir sua codificação) // no servidor, especifique um diretório para todos os arquivos carregados String path = getServletContext (). GetRealPath ("/upload"); System.out.println ("Path:"+Path); Arquivo dir = novo arquivo (caminho); if (! Dir.Exists ()) {Dir.mkdirs (); } // Defina o tamanho do buffer de arquivo temporário-8K buffer, endereço temporário do arquivo DiskFileItemFactory f = new DiskFileItemFactory (1024*8, novo arquivo ("d:/a")); // upload da ferramenta servletfileUpload upload = new ServletFileUpload (f); upload.setFilesizEMAX (1024*1024*5); // Defina o arquivo único máximo de upload como 5m upload.SetSizEMAX (1024*1024*8); //Set the maximum sum of all uploaded file sizes is 8M //▲4 Upload progress listening upload.setProgressListener(new ProgressListener(){ private double pre=0D; @Override//Parameter 1: How many bytes have been uploaded Parameter 2: How many bytes are total Parameter 3: Which file (serial number starts from 1) public void update(long pByteRead, long pContentLength, int pitems) {duplo d = 1.0*pbyteread/pcOntentLength*100; // Use a ferramenta Parsing para analisar a tentativa {list <FileItem> list = upload.parserequest (request); para (fileItem fi: list) {if ((fi.isformfield ())) {// se for um componente de formulário normal: caixa de seleção, rádio, senha ... // string desc = fi.getString (); System.out.println ("fi.getString ():"+fi.getString ()); // Segunda etapa string desc = fi.getString ("UTF-8"); // Esta frase define a codificação de conteúdo do componente de formulário normal.out.println ("codificação:"+desc); } else {// Protect: filtre componentes de arquivo vazios que não selecionaram se (fi.getSize () <= 0) {continuam; // Leia o próximo arquivo} System.out.println ("File Content Type:"+fi.getcontentType (); C: /users/adl1/desktop/a.txt string ext = fi.getName (). Substring (fi.getName (). LastIndexOf (".")); //. Txt string uuid = uuid.randomuuid (). String filename = uuid+ext; // Tecnologia de quebra do diretório de arquivos String dir1 = Integer.tohexString (uuid.hashcode () & 0x0f); String dir2 = Integer.toHexString ((uuid.hashcode () & 0xf0) >> 4); //fi.getInputStream () é a informação de arquivo real fileUtils.copyInputStreamTofile (fi.getInputStream (), novo arquivo (caminho+"/"+dir1+"/"+dir2+"/"+filename)); // escrito vivo}}}} (fileUPloadexception) {E. }}}Quebre a mensagem:
Quebre os resultados:
Arquivo 1:
Arquivo 2:
Demonstrar o princípio do preparar o progresso
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.