O upload de arquivo é muito comum em aplicativos da Web. É muito fácil implementar a função de upload de arquivos no ambiente JSP, porque existem muitos componentes de upload de arquivos desenvolvidos em Java na Internet. Este artigo leva o componente Commons-FileUpload como um exemplo para adicionar a função de upload de arquivo aos aplicativos JSP.
O componente Common-FileUpload é um dos projetos de código aberto da Apache e pode ser baixado em http://jakarta.apache.org/commons/fileupload/.
Este componente permite que você faça upload de um ou mais arquivos por vez e pode limitar o tamanho do arquivo.
Após o download, descompacte o pacote ZIP e copie o Commons-FileUpload-1.0.jar para o WebApps do Tomcat sob o seu WebAppWeb-Inflib. Se o diretório não existir, crie seu próprio diretório.
Crie um novo servlet: upload.java para upload de arquivos:
importar java.io.*; importar java.util.*; importar javax.servlet.*; importar javax.servlet.http.*; importar org.apache.commons.fileupload.*; A classe pública upload estende httpServlet {private string uploadpath = "c: upload"; // diretório para fazer upload de arquivos private string temppath = "c: uploadtmp"; // Diretório de arquivos temporários public void DoPost (solicitação httpServletRequest, httpServletResponse resposta) lança ioexception, servletexception {}}No método doPost (), quando o servlet recebe a solicitação de postagem emitida pelo navegador, ele percebe o upload do arquivo. Aqui está o código de amostra:
public void DoPost (solicitação httpServletRequest, httpServletResponse Response) lança IoException, servletexception {try {DiskFileUpload fu = new DiskFileUpload (); // Defina o tamanho máximo do arquivo, aqui está 4MBFU.SetSizEMAX (4194304); // Defina o tamanho do buffer, aqui está 4kbfu.setsizethreshold (4096); // Defina o diretório temporário: fu.setRepositoryPath (temppath); // Obtenha todos os arquivos: list FileItems = fu.parserequest (solicitação); Iterator i = fileItems.iterator (); // processa cada arquivo na sequência: while (i.hasnext ()) {fileItem fi = (fileItem) i.next (); // Obtenha o nome do arquivo, o nome do arquivo inclui o caminho: string filename = fi.getName (); // Aqui você pode gravar informações do usuário e do arquivo // ... // gravar no arquivo, o nome do arquivo tentativo é A.txt e o nome do arquivo pode ser extraído do nome do arquivo: fi.write (novo arquivo (uploadPath + "a.txt")); }} catch (Exceção e) {// você pode pular para a página de erro}}Se você quiser ler a pasta de upload especificada no arquivo de configuração, poderá executá -lo no método init ():
public void init () lança servletexception {uploadpath = .... temppath = .... // Se a pasta não existir, será criada automaticamente: if (! new File (uploadPath) .isDirectory ()) novo arquivo (uploadPath) .mkdirs (); if (! novo arquivo (temppath) .isdirectory ()) novo arquivo (temppath) .mkdirs (); }Compile o servlet, tenha cuidado para especificar o caminho de classe, inclua o Commons-Upload-1.0.jar e o tomcatcommonlibservlet-api.jar.
Configure o servlet, use o bloco de notas para abrir o TomCatwebApps para o seu WebAppweb-Infweb.xml e crie um novo, se não.
As configurações típicas são as seguintes:
〈? XML versão = "1.0" Encoding = "ISO-8859-1"?〉 〈! 2.3 // pt "" http://java.sun.com/dtd/web-app_2_3.dtd "> 〈web-app> 〈servlet> 〈servlet-name> upload 〈/servlet-name> 〈servlet-class> upload 〈/s Ervlet-class> 〈Servlet-mapping 〈Servlet-name> upload 〈/servlet-name> 〈url-padrão vens/fileUpload 〈/url-tattern 〈/servlet-mapping 〈/web-app 〈
Depois de configurar o servlet, inicie o Tomcat e escreva um teste HTML simples:
〈Form Action = "FileUpload" Method = "Post" Enctype = "Multipart/Form-Data" name = "form1"> 〈input type = "file" name = "FILE"> 〈INPUT TYPE = "Submite" Nome = "submeter" Value = "Upload"> 〈/Form>
Nota Action = "FileUpload", onde o FileUpload é o padrão de URL especificado ao configurar o servlet.
Aqui está o código para um camarão:
Este upload é muito mais fácil de usar do que o SmartUpload. Foi completamente criado por mim bytes um por um, diferentemente do SmartUpload que tem muitos bugs.
Método de chamada:
Upload up = new upload (); up.init (solicitação); /** pode chamar o setSavedir (string savedir); Defina o caminho de salvar e chamar setMaxFilesize (tamanho longo) para definir o byte máximo do arquivo carregado. Ligue para SettAgfilename (String) para definir o nome do arquivo após o upload (válido apenas para o primeiro arquivo)*/up. uploadfile ();
Então string [] nomes = up.getFilename (); Obtenha o nome do arquivo carregado, o caminho absoluto do arquivo deve ser
Diretório salvo savedir+"/"+nomes [i];
Você pode obter o texto carregado ou up.getParameterValues ("arquivado") através do up.getParameter ("campo");
Obtenha os valores dos campos com o mesmo nome, como várias caixas de seleção.
Experimente os outros.
O código -fonte é o seguinte: ______________________________________________________________________
pacote com.inmsg.beans; importar java.io.*; importar java.util.*; importar javax.servlet.*; importar javax.servlet.http.*; classe pública upload {private string savedir = "."; // caminho para salvar o arquivo private string contenttype = ""; // Tipo de documento Private String charset = ""; // conjunto de caracteres Private ArrayList tmpFileName = new ArrayList (); // Estrutura de dados temporários para armazenar nomes de arquivos parâmetros privados hashtable = new hashtable (); // estrutura de dados que armazena nomes de parâmetros e valoriza o contexto privado servletContext; // contexto do programa, usado para inicializar a solicitação privada httpServletRequest; // instância usada para passar no objeto de solicitação Private String limite = ""; // separador de dados de memória private int len = 0; // O comprimento do byte realmente é leu a partir do interior todas as vezes, o String Private String Querystring; Parte INT privada; // Número total de arquivos enviados String privada [] nome do arquivo; // Nome do arquivo enviado Arquivo Private MAXFILLEIGE = 1024 * 1024 * 10; // máxima de upload de arquivo de arquivo; String privada tagfilename = ""; Public Final Void Init (httpServletRequest Solicy) lança servletexception {this.request = request; limite = request.getContentType (). Substring (30); // Obtenha o delimitador de dados na memória querystring = request.getQueryString (); } public string getParameter (strings) {// usado para obter o valor do parâmetro do campo especificado, substituir request.getParameter (strings s) if (parameter.isempty ()) {return null; } return (string) parameter.get (s); } public string [] getParameTervAlas (strings s) {// usado para obter a matriz de parâmetros especificada com o mesmo campo de nome, substituir request.getParameterValues (strings) Arraylist al = new ArrayList (); if (parameter.isempty ()) {return null; } Enumeração e = parameter.keys (); while (e.HasMoreElements ()) {String key = (String) e.NextElement (); if (-1! = key.indexOf (s + "||||||||||| }} if (al.size () == 0) {return null; } String [] value = new String [al.size ()]; for (int i = 0; i 〈valor.length; i ++) {value [i] = (string) al.get (i); } retornar valor; } public string getQueryString () {return querystring; } public int getCount () {Return Count; } public string [] getFilename () {return filename; } public void setMaxFilesize (tamanho longo) {maxfilesize = size; } public void SettAgfilename (String filename) {tagFilename = filename; } public void se setSavedir (string savedir) {// Defina o caminho para economizar para o upload do arquivo this.Savedir = savedir; Arquivo testdir = novo arquivo (savedir); // Para garantir que o diretório exista, se não houver, crie o diretório if (! Testdir.exists ()) {testdir.mkdir (); }} public void setcharset (string charset) {// Defina o caractere definido this.charset = charset; } public boolean uploadfile () lança servletexception, ioexception {// upload método chamado pelo usuário setcharset (request.getcharacterencoding ()); retornar uploadfile (request.getInputStream ()); } private boolean uploadfile (servletInputStream servletInputStream) lança // o método principal para obter dados centrais de dados de armazenamento servletexception, ioexception {string line = null; byte [] buffer = novo byte [256]; while ((line = readLine (buffer, servletInputStream, charset))! = null) {if (line.startswith ("content-disposition: form-data;")) {int i = line.indexOf ("filename ="); if (i〉 = 0) {// Se houver nome do arquivo = na descrição em um delimitador, significa que é o conteúdo codificado do arquivo string fname = getFileName (line); if (fname.equals ("")) {continua; } if (count == 0 && tagfilename.length ()! = 0) {string ext = fname.substring ((fname.lastIndexOf (".") + 1)); fname = tagfilename + "." + ext; } tmpfilename.add (fname); contagem ++; while ((line = readLine (buffer, servletInputStream, charset))! = null) {if (line.length () 〈= 2) {break; }} Arquivo f = novo arquivo (savedir, fname); FileOutputStream DOS = new FileOutputStream (f); tamanho longo = 0l; while ((line = readLine (buffer, servletInputStream, null))! = null) {if (line.indexof (limite)! = -1) {break; } tamanho += len; if (size〉 maxfilesize) {lança a nova ioexception ("o arquivo excede" + maxfilesize + "byte!"); } dos.Write (buffer, 0, len); } dos.close (); } else {// Caso contrário, é o conteúdo do campo que codifica a chave da string = getKey (linha); String value = ""; while ((line = readLine (buffer, servletInputStream, charset))! = null) {if (line.length () 〈= 2) {break; }} while ((line = readLine (buffer, servletInputStream, charset))! = null) {if (line.indexof (limite)! = -1) {break; } valor += linha; } put (key, value.trim (), parâmetro); }}} if (querystring! = null) {string [] cada = split (querystring, "&"); for (int k = 0; k 〈cada.length; k ++) {string [] nv = split (cada [k], "="); if (nv.length == 2) {put (nv [0], nv [1], parâmetro); }}} nome do arquivo = new String [tmpfileName.size ()]; for (int k = 0; k 〈fileName.length; k ++) {nome do arquivo [k] = (string) tmpfileName.get (k); // Despeje o nome do arquivo temporário no ArrayList nos dados para o usuário chamar} if (filename.length == 0) {return false; // Se os dados do nome do arquivo estiverem vazios, isso significa que nenhum arquivo é carregado} retornar true; } private void put (chave da string, valor da string, hashtable ht) {if (! ht.containsKey (key)) {ht.put (chave, value); } else {// Se você já tiver uma chave com o mesmo nome, deve renomear a chave atual. Ao mesmo tempo, tenha cuidado para não formar o mesmo nome que a chave, tente {thread.currentThread (). Sleep (1); // Para não gerar duas chaves idênticas no mesmo ms} catch (Exceção e) {} key += "||||||||||||" " + System.currenttimemillis (); ht.put (chave, valor); }}/* Ligue para o método ServletInputStream.ReadLine (byte [] B, Int Offset, Length), que lê uma linha do fluxo ServletInputStream para a matriz de bytes especificada. Para garantir que ele possa acomodar uma linha, o byte [] B não deve ser inferior a 256. No readline reescrito, uma variável de membro é chamada para o número real de bytes lido (algumas linhas são inferiores a 256). Ao gravar o conteúdo do arquivo, o byte do comprimento len deve ser escrito na matriz de bytes em vez de todo o comprimento do byte []. No entanto, o método reescrito retorna a string para analisar o conteúdo real e não pode retornar o LEN, portanto, o LEN é definido como uma variável de membro e atribui o comprimento real a ele sempre que a operação de leitura. Ou seja, ao processar o conteúdo do arquivo, os dados devem ser retornados na forma de string para analisar as marcas de início e final e também gravados no fluxo de saída de arquivo na forma de byte [] ao mesmo tempo. */private String readLine (byte [] LineByte, servletInputStream servletInputStream, string charset) {try {len = servletinputStream.readline (linebyte, 0, linebyte.length); if (len == -1) {return null; } if (charset == null) {return new string (linebyte, 0, len); } else {return new String (linebyte, 0, len, charset); }} catch (exceção _ex) {return null; }} private String getFilename (linha de string) {// Separe o nome do arquivo da descrição String if (line == null) {return ""; } int i = line.indexof ("filename ="); line = line.substring (i + 9) .Trim (); i = line.lastIndexOf (""); if (i 〈0 || i vens = line.length () - 1) {i = line.LastIndexOf ("/"); if (line.equals ("" "")) {return ""; } if (i 〈0 || i vens = line.length () - 1) {linha de retorno; }} retornar line.substring (i + 1, line.length () - 1); } private String getKey (linha de string) {// Separe o nome do campo da string descrição se (linha == null) {return ""; } int i = line.indexof ("name ="); line = line.substring (i + 5) .Trim (); Return line.substring (1, line.length () - 1); } public static string [] split (string strob, string mark) {if (strob == null) {return null; } StringTokenizer st = new StringTokenizer (Strob, Mark); ArrayList tmp = new ArrayList (); while (St.HasmoreTokens ()) {tmp.add (St.NextToken ()); } String [] STRARR = new String [tmp.size ()]; for (int i = 0; i 〈tmp.size (); i ++) {Strarr [i] = (string) tmp.get (i); } retornar Salarr; }} Download é realmente muito simples. Contanto que você o processe da seguinte maneira, nenhum problema ocorrerá. download público void (string filepath, httpServletResponse resposta, boolean isonline) lança a exceção {arquivo f = novo arquivo (filepath); if (! f.Exists ()) {Response.SenderRor (404, "Arquivo não encontrado!"); retornar; } BufferInputStream Br = new BufferInputStream (new FileInputStream (f)); byte [] buf = novo byte [1024]; int len = 0; Response.Reset (); // é muito importante se (isonline) {// ononopen método url u = new url ("arquivo: ///"+filepath); Response.setContentType (U.OPenconnection (). GetContentType ()); Response.setheader ("Content-Disposition", "Inline; filename ="+f.getName ()); // O nome do arquivo deve ser codificado como UTF-8} else {// Método de download puro Response.SetContentType ("Application/X-MsDownload"); Response.setheader ("Content-Disposition", "Applement; filename =" + f.getName ()); } OutputStream out = Response.getOutputStream (); while ((len = Br.read (buf))〉 0) out.write (buf, 0, len); br.close (); out.Close (); }