O upload e o download dos arquivos é muito comum durante o desenvolvimento. Aqui está um breve resumo:
1. Condições que devem ser atendidas para upload de arquivo:
um. O método do formulário da página deve ser postado porque os dados transmitidos pelo get são muito pequenos
b. O encantador do formulário de página deve ser do tipo multipart/formulário
c. O formulário fornece detalhes sobre o upload do código do campo de entrada: no formulário do cliente: <form rypepe = "multipart/form-data"/>
(Se esta propriedade não estiver disponível, o caminho do arquivo lido pelo servidor variará dependendo do navegador)
Servidor servletInputStream is = request.getInputStream (); obtém o conteúdo do corpo de solicitação em um fluxo para análises adicionais.
2. Detalhes do upload de arquivos:
(1) Por que definir o tipo de formulário para: multipart/formulário. É para definir o valor passado por este formulário que não é o key = value. O que é passado é o bytecode.
A correspondência entre o formulário e a solicitação:
Como mostrado acima, você pode ver que, depois de definir o tipo de formulário para: Multipart/Form-Data, o arquivo selecionado é inicializado em binário no corpo de solicitação HTTP, conforme mostrado na figura acima sob uma sequência aleatória sob o cookie.
Mas observe que existem duas linhas especiais de caracteres no arquivo de arquivo dividido pelo arquivo de identificação (ou seja, uma sequência de strings aleatórios), a saber, a primeira linha do cabeçalho do arquivo de conteúdo e uma linha de linhas em branco. A terceira linha depois disso é o conteúdo do arquivo binário.
Portanto, quando o servidor aceita arquivos enviados pelo cliente, ao obter o binário de arquivo nos parâmetros de solicitação HTTP, as três primeiras linhas devem ser removidas.
3. Analise manualmente o arquivo TXT enviado:
importar java.io.bufferedReader; importar java.io.ioException; importar java.io.inputStream; importar java.io.inputStreamReader; importar java.io.printWriter; importação javax.servlet.servxception; import javax.sertlet.http.http.htp.htpstlet.sertleTexception; import javax.sertlet.http.http.htp.htp.htpstlet.ServleTexception; import javax.sertlet.http.http.htp.htp.htp.htps.htps.htps.htpslet.Servlet.ServleTception; importar javax.sertlet.http.htp.htp.htps.htps.htps.htps.htps.htpslet; javax.servlet.http.httpServletRequest; importar javax.servlet.http.httpServletResponse;/** * Se o tipo de formulário for post e o ENCTYPE for multipart/formulário *, todos os dados serão passados para o servidor no modo binário. * Então req.getParameter ("xxx") é sempre nulo. * Você só pode obter dados através do req.getInputStream () e obter os dados do texto * * @author wangxi * */classe pública upServlet estende httpServlet {public void DoPost (httPerSTleTreQuest req, httpServSponsonse) throws serveXexception, {IoxtestExcest, {httpSerSponsonse) String txt = req.getParameter ("txt"); // o retorno é null system.err.println ("txt é:"+txt); System.err.println ("=========================================="); InputStream in = req.getInputStream (); // byte [] b = novo byte [1024]; // int len = 0; // while ((len = in.read (b))! =-1) {// string s = new String (B, 0, len); // System.err.err.Print (S); InputStreamReader (in)); String FirstLine = Br.readline (); // Leia a primeira linha, e a primeira linha é um símbolo delimitado, ou seja, um nome de string aleatório string filename = Br.readline (); // a segunda linha de informações do arquivo e intercepte o nome do arquivo de it -filename = filename.substring (filename.LastIndexof ("//" //) 1; FileName.substring (0, FileName.Length ()-1); if (data.equals (FirstLine+"-") {Break; 4. Use Apache-FileUpload para processar uploads de arquivos:
Framework: refere -se a encapsular os negócios que os usuários costumam processar em um código. Facilitar a chamada dos usuários.
O componente (quadro) que atualmente carrega o arquivo:
Apache-FileUpload-
Orialiy cos 2008 () -
JSP-SMART-UPLOAD 200M.
Carregue o arquivo usando o FileUpload:
Requer a importação de pacotes de terceiros:
Apache-FileUpload.jar File carrega o pacote principal.
Apache-commons-io.jar Este pacote é um pacote de dependência para o FileUpload. É também um kit de ferramentas.
Categoria central:
O DiskFileItemFactory define espaço em disco e salva arquivos temporários. Apenas uma aula.
ServletfileUpload - A classe principal para uploads de arquivos, que recebe solicitações e analistas.
ServletfileUpload.parserequest (Request) - List <FileItem>
Note: A FileItem is the beginning of a logo: --------243243242342 To -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Etapa 1: importe o pacote:
Etapa 2: Escreva um servlet para completar o método dopost
/*** Dois parâmetros construídos pelo DiskFileItemFactory* O primeiro parâmetro: sizethreadhold - define quantos bytes de dados a serem salvos no cache (memória), o padrão é 10K* se um arquivo não for maior que 10k, você pode usar a memória para salvá -lo diretamente em um arquivo. * Se um arquivo for maior que 10k, você precisará salvar o arquivo em um diretório temporário primeiro. * O segundo arquivo de parâmetro refere-se à localização do diretório temporário * */classe pública UP2Servlet estende HttpServlet {public void DoPost (httpServletRequest Req, httpServletResponse resp) lança servletexception, ioexception {req.setcharacTerCoding " // Obtenha o caminho do projeto do projeto Path = getServletContext (). GetRealPath ("/up"); // A primeira etapa declara a classe DiskFileItemFactory Factory, usada para definir um diretório temporário no disco, discofileItemFactory Disk = new DiskFileItemFactory (1024*10, novo arquivo ("/home/wang/"); // A segunda etapa: Declare ServletFileUpoload e receba o diretório temporário acima servletfileUpload up = new ServletfileUpload (disco); // A terceira etapa: solicitação de parse tente {list <FileItem> list = up.parserequest (req); // se apenas um arquivo fileItem file = list.get (0); // Obtenha o nome do arquivo com o path string filename = file.getName (); FILENAME = FILENAME.SUBSTRING (FILENAME.LASTIndexOF ("//")+1); // Obtenha o arquivo de arquivo string filetype = file.getContentType (); // Obtenha o bytecode inputStream do arquivo em = file.getInputStream (); // Declare o fluxo de saída de saída outputStream Out = new FileOutputStream (Path+"/"+FileName); // Arquivo Copy Byte [] B = novo byte [1024]; int len = 0; while ((len = in.read (b))! =-1) {out.write (b, 0, len); } out.close (); tamanho longo = file.getInputStream (). Disponível (); // Exclua o arquivo temporário do FILE.DELETE (); // mostra dados resp.setContentType ("text/html; charset = utf-8"); PrintWriter op = resp.getWriter (); op.print ("Arquivo enviado com sucesso <br/> Nome do arquivo:"+nome do arquivo); op.print ("<br/> Tipo de arquivo:"+FileType); op.print ("<br/> Tamanho do arquivo (bytes)"+tamanho); } catch (Exceção e) {e.printStackTrace (); }}}5. Use esta estrutura para fazer upload de vários arquivos:
Etapa 1: modifique o formulário da página para vários tipos de entrada = "arquivo"
<Form Action = "<C: URL Value = '/UP3Servlet' //>" Method = "Post" ENCTYPE = "Multipart/Form-Data"> file1: <input type = "file" name = "txt"> <br/> file2: <input type = "file" = "txt"> <br/> <input = "
Etapa 2: Lista de Traverse
classe pública UP3Servlet estende httpServlet {public void DoPost (solicitação httpSertLeQuest, httpServletResponse Response) lança servletexception, ioexception {request.setcharacterencoding ("utf-8"); String Path = getServletContext (). GetRealPath ("/up"); // declara disco diskFileItemFactory Disk = new DiskFileItemFactory (); Disk.SetSizETHreshold (1024*1024); disk.setRepository (novo arquivo ("d:/a")); // Declare o servlet que analisa a solicitação servletfileUpload up = new ServletFileUpload (disco); tente {// Resolve Solicle List <FileItem> list = up.parserequest (request); // Declare uma lista <Pap> encapsula os dados da lista de arquivos carregados <map <string, string >> ups = new ArrayList <map <string, string >> (); para (arquivo fileItem: list) {map <string, string> mm = new hashmap <string, string> (); // Obtenha o nome do arquivo string filename = file.getName (); FILENAME = FILENAME.SUBSTRING (FILENAME.LASTIndexOF ("//")+1); String filetype = file.getContentType (); InputStream in = file.getInputStream (); int size = in.Available (); // Use a classe de ferramenta FileUtils.copyInputStreamTofile (in, novo arquivo (Path+"/"+FileName)); mm.put ("nome do arquivo", nome do arquivo); mm.put ("FileType", FileType); mm.put ("size", "+size); ups.add (mm); file.delete ();} request.setAttribute (" ups ", ups); // forward request.getRequestDispatcher (" JSPS/show.jsp ").O acima é o método comum de fazer upload de arquivos. Agora, vamos dar uma olhada nas outras APIs de pesquisa do FileUpload.
Determine se um fileItem é um objeto de arquivo (type = arquivo) ou um texto (type = text | caixa de seleção | rádio) objeto:
boolean isformfield () Se for texto | Caixa de seleção | Rádio | Selecionar, o valor será verdadeiro.
6. Processar fotos com informações de descrição
classe pública updescServlet estende HttpServlet {public void DoPost (solicitação HttPervletRequest, httpServletResponse resposta) lança servletexception, ioexception {request.SetcharAcTerCoDing ("utf-8"); //. DiskFileItemFactory Disk = new DiskFileItemFactory (); disk.setRepository (novo arquivo ("d:/a")); tente {servletfileUpload up = new ServletFileUpload (disco); List <FileItem> list = up.parserequest (solicitação); for(FileItem file:list){ //Step 1: Determine whether it is an ordinary form item if(file.isFormField()){ String fileName = file.getFieldName();//<input type="text" name="desc">=desc String value = file.getString("UTF-8");//By default, read data in ISO, System.err.println(fileName+"="+value); } else {// indica que é um arquivo string filename = file.getName (); FILENAME = FILENAME.SUBSTRING (FILENAME.LASTIndexOF ("//")+1); file.write (novo arquivo (caminho+"/"+nome do arquivo)); System.err.println ("O nome do arquivo é:"+nome do arquivo); System.err.println ("O tamanho do arquivo é:"+file.getSize ()); file.Delete (); }}} catch (Exceção e) {e.printStackTrace (); }}} 7. desempenho aprimorado do upload de arquivo
Ao analisar a solicitação para obter a coleção FileItem, use:
FileItemiterator it = up.getItemiterator (request);
Comparado ao uso
List <FileItem> list = up.parserequest (solicitação);
Desempenho muito melhor.
Código de exemplo:
classe pública FastServlet estende httpServlet {public void DoPost (solicitação httpServletRequest, httpServletResponse resposta) lança servletexception, ioexception {request.setcharacterencoding ("utf-8"); String Path = getServletContext (). GetRealPath ("/up"); DiskFileItemFactory Disk = new DiskFileItemFactory (); disk.setRepository (novo arquivo ("d:/a")); tente {servletfileUpload up = new ServletFileUpload (disco); // o seguinte é o modo ITERator FileItemiterator it = up.getItemiterator (request); while (it.hasnext ()) {fileItemStream item = it.Next (); String filename = item.getName (); FILENAME = FILENAME.SUBSTRING (FILENAME.LASTIndexOF ("//")+1); InputStream in = item.openstream (); Fileutils.copyInputStreamTofile (in, novo arquivo (caminho+"/"+nome do arquivo)); }} catch (Exceção e) {e.printStackTrace (); }}} 8. Faça o download do arquivo
Pode ser Get ou Post.
public void DoPost (httpServletRequest req, httpServletResponse resp) lança servletexception, ioexception {req.setcharacterencoding ("utf-8"); Nome da string = req.getParameter ("Nome"); // Etapa 1: defina o tipo de resposta resp.setContentType ("Application/Force-download"); // o segundo caminho do arquivo de leitura Path = getServletContext (). GetRealPath ("/up/"+nome); InputStream in = new FileInputStream (caminho); // Defina o cabeçalho da resposta // Usert URL codificação do nome do arquivo Nome = urlencoder.encode (nome, "utf-8"); resp.setheader ("Disposição de conteúdo", "anexo; nome do arquivo ="+nome); resp.SetContentLength (in.Available ()); // Etapa 3: Inicie a cópia do arquivo outputStream out = resp.getOutputStream (); byte [] b = novo byte [1024]; int len = 0; while ((len = in.read (b))! =-1) {out.write (b, 0, len); } out.close (); in.Close (); } Ao usar a estrutura popular J2EEÉ mais fácil usar o encapsulamento interno da estrutura para preencher o upload e download:
Struts2 é carregado.
Ao usar o STRUTS2 para desenvolvimento, não é difícil descobrir que o pacote Commons-FileUpload-1.3.1.jar está presente no pacote de jar importado. Através do aprendizado acima, já podemos usá -lo para fazer upload e baixar arquivos. Mas o Struts2 está passando por um novo encapsulamento.
visualizar
<Form Action = "fileUpload.Action" Method = "Post" Enctype = "Multipart/Form-Data"> Nome de usuário: <input type = "text" name = "username"> <br> arquivo: <input type = "file" name = "file"> <br> <brut type = "submit" value = "subt ="
Controlador
classe pública FileUploadAction estende o ActioPupport {private string nome de usuário; // Observe que o arquivo não se refere ao próprio arquivo enviado pelo JSP front-end, mas o arquivo enviado para armazenar arquivo de arquivo de arquivo privado na pasta temporária; // O nome do arquivo enviado // struts interceptará automaticamente o nome do último arquivo e o injetará nessa propriedade Private String FileFilename; // getter e setter são salvos neste momento para salvar o espaço @Override public string Execute () lança Exceção {// Salvar o caminho para carregar o arquivo string root = servletActionContext.getServletContext (). GetRealPath ("/upload"); // Obter arquivo de entrada de arquivo temporário inputStream is = new FileInputStream (arquivo); // OUTRIR FILE OUTURTSTREAM OS = new FileOutputStream (novo arquivo (root, fileFileName)); // imprima o nome do arquivo do arquivo de arquivo carregado.out.println ("FileFilename:" + FileFilename); // Como o arquivo é um arquivo armazenado em uma pasta temporária, podemos imprimir o nome do arquivo e o caminho do arquivo para ver se é o mesmo que o arquivo fileFileName anterior.out.println ("arquivo:" + file.getName ()); System.out.println ("arquivo:" + file.getPath ()); byte [] buffer = novo byte [1024]; int length = 0; while (-1! = (length = is.read (buffer, 0, buffer.length))) {os.Write (buffer); } os.close (); is.close (); sucesso de sucesso; }}Primeiro de tudo, precisamos deixar claro que o arquivo aqui não se refere ao arquivo carregado pelo JSP. Quando o arquivo for enviado, o STRUTS2 procurará primeiro o local de armazenamento especificado por struts.multipart.savedir (isso está no padrão.properties) (o padrão está vazio). Podemos especificar esse local de armazenamento temporário no Struts2 do nosso projeto.
<constante name = "struts.multipart.savedir" value = "/repositório"/>
Se o struts.multipart.savedir não estiver definido, o endereço especificado por javax.servlet.context.tempdir será usado por padrão. O valor de javax.servlet.context.tempdir é determinado pelo servidor. Por exemplo: se o contexto do meu projeto da web é ABC e o servidor usa o TomCat, o salvamento do salvamento deve ser %tomcat_home %/work/catalina/localhost/abc_. O nome do arquivo temporário é semelhante ao upload__1a156008_1373a8615dd__8000_00000001.tmp. O nome do arquivo temporário pode ser diferente a cada vez, mas está aproximadamente nesse estilo. E se você usar servidores no Eclipse para configurar o TomCat e iniciar, o % Tomcat_Home % no endereço acima não será o diretório raiz do Tomcat real no sistema, mas será o endereço especificado pelo Eclipse. Por exemplo, meu endereço local é o seguinte: /home/wang/eclipsejavacode/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/0011111111111111111111111111111111111111111111111111111111111111111111111133813381313381113381133813133813381313381333838383838383813383083838308308133830.
O Struts2 terminou de baixar.
Faça o download do arquivo STRUTS2 de maneira mais simples, basta definir um fluxo de entrada e gravar o arquivo no fluxo de entrada. A configuração de chave ainda é configurá -la no arquivo de configuração do struts.xml:
classe pública FilledOwnLoadAction estende o ACOCTIPPORT {// O caminho para baixar o arquivo no caminho do servidor Private String Path; // o nome do arquivo do arquivo para baixar o private string downloadfilename; // grava getter e setter public inputStream getDownLoadFile () {retorna servletActionContext.getServletContext (). GetResourceasStream (path); } @Override public String Execute () lança Exceção {// A ação atual é setTownLoadFilename (xxx); sucesso de sucesso; }}A ação apenas define um arquivo de download de fluxo de entrada e, em seguida, fornece um método getter. Em seguida, vamos dar uma olhada no arquivo de configuração de struts.xml:
<ação name = "fileDownload"> <resultado name = "download" type = "stream"> <param name = "contentDispition"> Appion; filename = "$ {downloadfilename}" </param> <param name = "inputName"> downloadfile </amam> </resultado> </action>Existem vários lugares em que precisamos prestar atenção ao arquivo de configuração Struts.xml. Primeiro, o tipo deve ser definido como tipo de fluxo, dizendo que a ação é o resultado do download do arquivo. O elemento de resultado geralmente possui um subelemento param. Isso é usado para definir os parâmetros ao baixar o arquivo. O atributo InputName é obter o fluxo de entrada de arquivo na ação. O nome deve ser o mesmo que o atributo do fluxo de entrada na ação. Então o atributo de conteúdo da disposição. Esse atributo é geralmente usado para especificar como queremos processar o arquivo baixado. Se o valor for um anexo, uma caixa de download será exibida, permitindo que o usuário escolha o download. Se esse valor não estiver definido, o navegador verificará primeiro se abrirá o arquivo baixado. Se puder, abrirá diretamente o arquivo baixado (é claro que não é o que precisamos). Outro valor é o nome do arquivo, que é o nome do download do arquivo solicitado pelo arquivo ao baixar. Depois de configurar essas informações, podemos implementar a função de download de arquivos.
Springmvc conclui o upload:
A visualização é exatamente a mesma do exemplo do Struts2. Isso não está escrito.
Controlador:
@Controlador@requestmapping (value = "fileoPerate") public class FileOperateAction {@RequestMapping (value = "upload") public string upload (httpServletReQuest Solicy,@requestParam ("arquivo") MultipartFile Photofile) {// Path para fazer o upload de arquivos (string dir = "). // o nome do arquivo original string filename = Photofile.getoriginalfilename (); // Obtenha a string de extensão de arquivo extName = filename.substring (filename.lastindexof (".")); // impedir o nome do arquivo conflitos, modifique ligeiramente o nome FILENAME = FILENAME.SUBSTRING (0, FILENAME.LASTIndexOf (".". "))) + System.nanotime () + extName; FileUtils.WriteByTearArraytofile (novo arquivo (dir, nome do arquivo), Photofile.getBytes ()); retornar "sucesso"; }}Download completo de Springmvc:
@RequestMapping ("/Download") public String Download (String FileName, HttpServletRequest Request, HttpServletResponse Response) {Response.Setcharacterencoding ("UTF-8"); Response.setContentType ("Multipart/Form-Data"); Response.setheader ("Content-Disposition", "Applement; FileName =" + FileName); tente {inputStream inputStream = new FileInputStream (novo arquivo (caminho do arquivo); outputStream OS = Response.getOutputStream (); byte [] b = new Byte [2048]; int length; while (comprimento = inputStream.read (b))> 0) {OS.Write (B, 0, 0, comprimento); inputStream.close ();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.