Recentemente, o projeto precisa ser carregado um arquivo. Depois de concluir o trabalho, compartilhe -o e faça anotações também.
A função de upload é implementada em segundo plano e Java, e o front-end é implementado principalmente no Ajax do JS. O plano de fundo também adiciona arquivos temporários a serem excluídos regularmente.
O efeito é como mostrado na imagem
Primeiro de tudo, a classe principal da função de upload, o seguinte é o código
pacote util.upload; importar java.io.file; importar java.io.ioException; importar java.text.simpledEformat; importar java.util.date; importar java.util.iterator; import java.util.list; import java.util.uUuid; importação; javax.servlet.http.httpServlet; importar javax.servlet.http.httpServletRequest; importar javax.servlet.http.httpStletResponse; importache; org.apache.commons.fileupload.disk.diskfileItemFactory; importar org.apache.commons.fileupload.servlet.servletfileUpload; classe pública UploadServlet. Privado booleano é permitido; String privada Upfilename; // Defina a matriz com o nome do sufixo legal Private String [] allowExtName = new String [] {"zip", "rar", // File File "txt", "doc", "wps", "docx", "java", // text "xls", "xlsx", // tabela "ppt", "pptx", // slide "pdf", // play "f" jpg "," bmp "gif (gif (png"/hag "/hageted; Resposta da Resposta da Resposta a HttPertleSponse) lança servleTexception, ioexception {DoPost (solicitação, resposta); response.setCharacterEncoding("utf-8"); //Get session, save progress and upload results, upload starts as nok, when Ok means uploading is completed HttpSession session=request.getSession(); session.setAttribute("result", "nok"); session.setAttribute("error", ""); String error=""; upFileName=""; isAllowed=false; //Set um valor máximo para o arquivo carregado, que não deve exceder 100MB int maxSize = 100*1024*1024; ServletfileUpload upload = new ServletFileUpload (fábrica); // Crie o ouvinte de upload e defina o ouvinte Listener UPLOUPLENER = new UPLOUPListener (); session.setAttribute ("ouvinte", ouvinte); upload.setProgressListener (ouvinte); // Carregar o caminho do caminho da sequência de string = request.getSession (). GetServletContext (). GetRealPath ("/upload"); String requestPath = request.getSession (). GetServletContext (). GetContextPath ()+"/upload"; Arquivo Dirfile = novo arquivo (caminho); //System.out.println(request.getSession (). GetServletContext (). GetContextPath ()); // Se a pasta não existir, crie if (! Dirfile .Exists () &&! Dirfile .isDirectory ()) {Dirfile .mkdir (); } // Crie uma pasta com base na data e salve -a na pasta com a data da data correspondente = new Date (); SimpledateFormat sdf = new SimpleDateFormat ("yyyymmdd"); String subdirname = sdf.format (data); Arquivo subdirfile = novo arquivo (caminho+"/"+subdirname); if (! subdirfile .exists () &&! subdirfile .isdirectory ()) {subdirfile .mkdir (); } tente {// Lista de solicitações de upload de análise <FileItem> itens = upload.parserequest (request); Iterator <FileItem> itr = items.iterator (); while (itr.hasnext ()) {fileItem item = (fileItem) itr.Next (); // determine se é um domínio de arquivo if (! Item.isformfield ()) {if (item.getName ()! = Null &&! Item.getName (). Equals ("")) {// Obtenha o tamanho do arquivo enviado e o nome do arquivo upfilesize longo = item.getSize (); String filename = item.getName (); // Obtenha o nome do sufixo do arquivo string [] splitName = filename.split ("//."); String extName = splitName [splitName.length-1]; // Verifique o nome do sufixo do arquivo para (string permitido: allowextName) {if (permitido.equalsignorecase (extName)) {isallowed = true; }} if (! isalded) {error = "O formato do arquivo de upload é ilegal!"; quebrar; } if (upFilesize> maxSize) {Error = "O arquivo que você carrega é muito grande, selecione um arquivo que não exceda 100 MB!"; quebrar; } // Neste momento, o arquivo é temporariamente armazenado na memória do servidor, construindo um arquivo de objeto temporário tempfile = novo arquivo (makefilename (nome do arquivo)); // Especifique o diretório e o nome do arquivo do arquivo de arquivo de upload do arquivo Arquivo do servidor = novo arquivo (Path+"/"+SubdirName+"/", tempfile.getName ()); item.write (arquivo); // O primeiro método de gravação do arquivo é upfilename = requestPath+"/"+subdirname+"/"+tempfile.getName (); if (upfilename.equals ("")) {error = "Nenhuma seleção para fazer upload de arquivo!"; } System.out.println (upFileName); /*// Construa o segundo método de gravação do arquivo de arquivo de leitura de fluxo de entrada inputStream is = item.getInputStream (); int length = 0; byte [] por = novo byte [1024]; FileOutputStream fos = new FileOutputStream (FILE); while ((comprimento = is.read (por))! =-1) {fos.Write (por, 0, comprimento); //Thread.sleep(10); } fos.close (); //Thread.sleep(1000); */} else {error = "Nenhuma seleção para fazer upload de arquivo!"; }}}} catch (Exceção e) {e.printStackTrace (); error = "Ocorreu o erro ao fazer o upload do arquivo:"+e.getMessage (); } if (! error.equals ("")) {System.out.println (erro); session.setAttribute ("erro", erro); } else {session.setAttribute ("resultado", "ok"); session.setAttribute ("FileName", UpFileName); }} / *** Para impedir a substituição de arquivos, um nome de arquivo exclusivo deve ser gerado para fazer o upload do arquivo* @param fileName Name original Nome do arquivo* @return o nome de arquivo exclusivo gerado* / private string makefilename (string filename) {return uuid.randomuuid (). }} É necessário introduzir o Commons-FileUpload-1.3.1.jar e Commons-io-2.4.jar
Durante o processo de upload, precisamos obter informações como fazer upload de progresso em tempo real. A biblioteca introduzida adicionou uma interface de listener de progresso para nós. Escreveremos outra classe para implementar essa interface e adicionar essa interface à classe acima.
// Crie objetos de fábrica e upload de arquivos Objetos DiskFileItemFactory Factory = new DiskFileItemFactory (); ServletfileUpload upload = new ServletFileUpload (fábrica); // Crie o ouvinte de upload e defina o ouvinte Listener UPLOUPLENER = new UPLOUPListener (); session.setAttribute ("ouvinte", ouvinte); upload.setProgressListener (ouvinte);Abaixo está o código de implementação específico desta classe de escuta
pacote util.upload; importar org.apache.commons.fileupload.progressListener; public classe uPLOUPLISTEner implementa ProgressListener {private volátil long bytesread = 0l, // número de bytes upload contentLength = 0l, // número total de item byTes = 0l; public uPLOUPLISTER () {super (); } @Override public void update (abytesread longo, longo comprimento, int anitem) {bytesread = abytesread; contentLength = acontentLength; item = anitem; } public long getBytesRead () {return bytesRead; } public long getContentLength () {return contentLength; } public long getItem () {return item; }}Agora você pode obter informações como o upload de progresso, mas ainda precisa de um servlet para retornar ao front end. A seguinte implementação
pacote util.upload; importar java.io.ioException; importar java.io.printwriter; importar java.util.hashmap; importar java.util.map; importar javax.Servlet.Servletexcept; import Javax.Servlet.LetTsTttlet.portmport; javax.servlet.http.httpServletResponse; importar javax.servlet.http.httpsession; importar org.apache.commons.fileupload.progressListen; importar complyt e outros roglestslisten; ertrends; ultimenstlends; ertrends; uplos e outro, a melhorar a classe, a melhorar os erros, a base de energia, a melhorar a classe, a seriedade e a seriedade e a seriedade e a seriedade e a sessão de compra e a seriedade e a base de serviços, a melhorar os outros; HttpServlet {private estático final serialversionuid = -3596466520775012991L; Void protegido Doget (solicitação httpServletRequest, httpServletResponse Response) lança servletexception, ioexception {DoPost (solicitação, resposta); } Void protegido doPost (solicitação httpServletRequest, resposta httpServletResponse) lança servletexception, ioexception {request.setcharacterencoding ("utf-8"); Response.Setcharacterencoding ("UTF-8"); Listener de uploadListener = NULL; Session httpSession = request.getSession (); String error = (string) session.getAttribute ("erro"); String result = (String) session.getAttribute ("resultado"); String filename = (string) session.getAttribute ("nome do arquivo"); PrintWriter out = Response.getWriter (); Long bytesread = 0, contentLength = 0; if (session! = null) {ouvinte = (uploadListener) session.getAttribute ("ouvinte"); if (ouvinte == null) {return; } else {bytesRead = listener.getBytesRead (); // o número de bytes carregados contentLength = listener.getContentLength (); // Total bytes} // O formato de retorno definido por você é string rp = Bytes +"," +contentLengen +"," +erro +"" " +; //System.out.println(rp); out.print (rp); /* // retorna o mapa de dados do formato json <string, object> map = new hashmap <string, object> (); map.put ("bytesread", bytesread); map.put ("contentLength", contentLength); map.put ("erro", erro); map.put ("resultado", resultado); map.put ("nome do arquivo", nome do arquivo); Gson gson = new gson (); String json = gson.tojson (mapa); out.print (json);*/ out.flush (); out.Close (); }}}O código da função enviado em segundo plano foi escrito. A seguir, o front-end para implementar o upload, antes de tudo, html
<! Doctype html> <html> <head> <meta charset = "utf-8"/> <script type = "text/javascript" src = "js/upfile.js" charset = "utf-8"> </script> <link = "stylesheet" type = "text/css/css" hiath> </script> <link = "stylesheet" type = "text/css/css" hiath> </script> <link "/" stylesheet "type =" text/css/css "> </script> <link =" stylesheet "type =" text/css " <Body> <a href = "javascript: addone ()"> add </a> <div id = "target"> <input type = "file" id = "file" name = "file" onchange = "addfile (event)" múltiplo/> </div> <span id = "test"> 0 </span> </body) "</html>
A interface é relativamente simples, basta adicionar uma tag e a entrada carregada está oculta.
Exibição do progresso de upload do arquivo CSS Renderização principal
#File {Display: Nenhum; } .pro {width: 500px; } .pborder {Position: relativo; Largura: 500px; /* Largura*/ borda: 1px sólido #b1d632; preenchimento: 1px; } .drawpro {width: 0px; exibição: bloco; Posição: relativa; Antecedentes: #B1D632; Cor: #333333; Altura: 20px; /* Altura*/ altura da linha: 20px; /* Deve ser consistente com a altura antes que o texto possa ser centralizado verticalmente*/} .pspan {Position: Absolute; Largura: 500px; Alinhamento de texto: centro; Peso da fonte: negrito; }Em seguida é o foco do front-end, o arquivo JS
// o htmlvar upfile_html que exibe informações de upload é '<div> <div>' + '<pan> 0%</span> </div> </div> <name span = "path"> </span> <img src = "Common/upload/imagens/del.png" style = "flhoat: names" names = "; Targetdiv_id = "Target"; // O idVar do alvo div para fazer upload do arquivo httpxml = null; // o objeto xmlhttprequest que envia a solicitação de upload var httprogress = null; // xmlHttPrEQUEST que envia a falha de solicitação vars oldFilist = null; new Array (); // Salvar a lista de arquivos carregados var f_input; // Carregar o objeto de entrada que carrega o arquivo var flag = true; // pode o próximo sinalizador de arquivo var uurl = "upload"; // solicitar o upload do arquivo uRLvar; var nowid = 0; // idVar ID do arquivo que está sendo carregado = 0; // ID do último arquivo na fila/*** Objeto do arquivo*/function uploadFile (id, arquivo) {this.id = id; this.File = arquivo; this.state = 0; this.path = "";}/*** Método de inicialização*/window.onload = function init () {f_input = document.getElementById ("arquivo"); var tdiv = document.getElementById (TargetDiv_id); Var Oldspan = tdiv.getElementsByTagName ("span"); for (var i = 0; i <Oldspan.Length; i ++) {OldFilelist.push (Oldspan [i] .getAttribute ("nome")); }}/** * Selecione um arquivo para fazer upload */function addone () {f_input.value = null; f_input.Click ();}/*** Depois de selecionar o arquivo, adicione o objeto do arquivo à fila e inicie o upload**/função addfile (evt) {var f = f_input.files [0]; if (f! = indefinido) {var uf = novo uploadFile (id, f); uplist.push (uf); var div = document.createElement ("div"); Div.SetAttribute ("ID", "Pro" + (id)); Div.SetAttribute ("Class", "Pro"); div.innerhtml = upfile_html; var TargetDiv = document.getElementById (TargetDiv_id); TargetDiv.AppendChild (div); Div.getElementsByTagName ("span") [1] .innerhtml = "Nome do arquivo:" + uplist [id] .file.name; waittimer = setInterval ("upload ()", 1000); Id ++; }}/*** Carregue o arquivo na fila*/function upload () {if (flag == true) {if (upslist.length> 0) {var uf; for (var i = 0; i <upslist.length; i ++) {if (uplist [i] .State == 0) {uf = uplist [i]; uplist [i] .State = 1; quebrar; }} if (uf! = indefinido & uf! = null) {flag = false; if (window.xmlHttPrequest) {httpup = new XmlHttPrequest (); } else if (window.activexObject) {httpup = new ActivexObject ("microsoft.xmlhttp"); } var formData = new FormData (); formData.append ("arquivo", uf.file); httpup.open ("post", uurl, true); httpup.upload.addeventListener ('Progress', UploadProgress, false); httpup.send (formData); NowId = uf.id; timer = setInterval ("getp ()", 50); }}}}/*** Obtenha informações como fazer upload progresso*/function getp () {if (window.xmlhttpRequest) {httpprogress = new xmlhttPrequest (); } else if (window.activexObject) {httpprogress = new ActivexObject ("microsoft.xmlhttp"); } httpprogress.onReadyStatechange = onProgress; httpprogress.open ("post", gurl, true); httpprogress.setRequestHeader ("Content-Type", "Application/X-Www-Form-Urlencoded"); httpprogress.send ("& timestamp =" + (new date ()). gettime ());}/*** Processe as informações de upload retornadas e exiba -as na interface*/function onProgress () {if; var resultado = resultado.Replace (/(^/s*) | (/s*$)/g, ""); var res = resultado.split (","); var agora = parseint (res [0]); var all = parseint (res [1]); var err = res [2]; var estado = res [3]; var path = res [4]; var per = (agora / all * 100) .tofixado (2); var Prodiv = document.getElementById ("Pro" + NowId); if (Prodiv! = NULL & Prodiv! = Undefinido) {if (err! = "" & err! = null & err.length> 0) {window.clearInterval (timer); if (cancelflag == 1) {err = "upload terminação"; cancelflag = 0; } prod.getElementsByTagName ("div") [0] .style.display = "nenhum"; Prodiv.getElementsByTagName ("span") [1] .innerhtml = err; httpup.abort (); bandeira = true; uplist [agoraid] .State = 3; retornar; } if (state == "ok") {prod.getElementsByTagName ("div") [0] .style.display = "nenhum"; var tmpf = uplist [agoraid] .File; Prodiv.getElementsByTagName ("span") [1] .innerhtml = "Nome do arquivo:" + tmpf.name; window.clearInterval (timer); bandeira = true; uplist [NowId] .State = 2; uplist [agoraid] .Path = Path; retornar; } prod.getElementsByTagName ("div") [1] .style.width = por * 5 + "px"; Prodiv.getElementsByTagName ("span") [0] .innerhtml = por + "%"; }}}/*** Método para cancelar o upload*/função abortUpload (obj) {var idstr = obj.parentnode.id; var id = idstr.slice (3); if (uplist [id] .state == 1) {httpup.abort (); bandeira = true; cancelflag = 1; } else {uplist [id] .state = 3; } document.getElementById (idstr) .remove ();}/*** Obtenha o caminho para fazer upload do arquivo* @returns String formatada*/function getFileListr () {var str = ""; if (OldFilelist.Length> 0) {for (var i = 0; i <OldFilelist.Length; i ++) {if (OldFilelist [i]! = null & OldFilelist [i]! = "" & OldFilelist [i]! =! }}} para (var i = 0; i <upslist.length; i ++) {var f = uplist [i]; if (f.state == 2) {str = str + f.path + ","; }} return str;}/*** Remova o anexo antigo que já estava lá quando a modificação**/função removedold (btn) {var num = btn.getAttribute ("nome"); OldFilelist [num - 1] = null; btn.parentnode.remove ();} função uploadProgress (e) {if (e.LengthComputable) {var ibyTesUploaded = E.Loaded; var ibyTestotal = E.Total; Document.getElementById ("Test"). Innerhtml = iBytesUPploaded+"/"+iByTestotal; }} Use o AJAX para enviar arquivos de upload para obter progresso, resultados e outras informações sobrecarregar.
A API do arquivo html5 usada é para que o IE9 ou acima deve ser compatível. O Firefox tem um problema. As solicitações de Ajax não retornam imediatamente. O mesmo resultado será retornado até que todas as solicitações do AJAX sejam enviadas, o que resultará na exibição do progresso do upload. No entanto, você também pode usar a API do arquivo HTML5 para obtê -la, que tem um pequeno código adicionado. O valor no teste de teste abaixo da página é o progresso obtido no front end.
Todos os arquivos enviados foram implementados e, em seguida, os arquivos temporários enviados são processados. Como os arquivos nomeados UUID são usados, muitos arquivos serão gerados e os inúteis precisam ser processados regularmente. Usando ServletContextListener:
Existe uma interface ServletContextListener na API Servlet, que pode ouvir o ciclo de vida do objeto ServletContext, que é na verdade o ciclo de vida do aplicativo da Web.
Quando o contêiner do servlet inicia ou termina um aplicativo da Web, o evento ServletContextevent é acionado, que é tratado pelo ServletContextListener. Dois métodos são definidos na interface ServletContextListener para lidar com o evento ServletContextevent.
Usando seus recursos, a função de excluir arquivos temporários é realizada regularmente. O código é o seguinte:
pacote util.upload; importar java.io.ioException; importar java.io.inputStream; importar java.util.date; importar java.util.properties; import javax.util.tetlectContet; importContet; importContet; importContet; importContet; importContet; importContet; importContet; importContet; importContet; importantextext; javax.servlet.servletContextListener;/ ** * ouvinte horário * * */ public classe TempFileListener implementa ServletContextListener {Timer privado; private SystemTaskTest SystemTask; String estática privada Every_time_run; static {Properties Prop = new Properties (); InputStream instrem = tempfilemanager.class.getclassloadler () .getResourceasStream ("tempfile.properties"); tente {prop.load (instrem); System.out.println (Instrem); Every_time_run = prop.getProperty ("Everythtime_run"); } catch (ioexception e) {e.printStackTrace (); } finalmente {tente {Instrem.close (); } catch (ioexception e) {e.printStackTrace (); }}} // Método inicial do ouvinte Public void contextinitialized (servletContextevent scce) {timer = new Timer (); SystemTask = new SystemTaskTest (sce.getServletContext () .GetRealPath ("/"), sce.getServletContext ()); tente {System.out.println ("Timer iniciado"); // O ouvinte recebe o diretório raiz do site string path = scce.getServletContext (). GetRealPath ("/"); Long time = long.parselong (Every_time_run) * 1000; // O tempo para o loop de execução System.out.println ("time" + time); // O primeiro parâmetro é o código a ser executado, o segundo parâmetro é quando ele começa a ser executado e o terceiro parâmetro é com que frequência ele está sendo executado. Repita a execução do Timer.Schedule (SystemTask, 10000, Time); System.out.println ("cronograma de tarefas foi adicionado"); } catch (Exceção e) {e.printStackTrace (); }} public void contextDestroyed (servletContextevent scal) {try {timer.cancel (); } catch (Exceção e) {}}} / *** TEMPO TEMPO TEMPO** / classe SystemTaskTest estende Timertosk {private servletContext Context; Caminho de cordas privadas; public SystemTaskTest (Caminho da String, ServletContext Context) {this.path = Path; this.Context = context; } / *** Coloque a tarefa a ser executada regularmente no run* / public void run () {tempfilemanager etf; tente {System.out.println ("Inicie a tarefa!"); // código a ser executado System.out.println (new Date (). Tolocalestring ()); ETF = novo TempFilemanager (Path); etf.run (); System.out.println ("Especifique a execução da tarefa é concluída!"); } catch (Exceção e) {e.printStackTrace (); }}}O exposto acima é apenas um ouvinte, responsável por chamar o método para excluir arquivos temporários regularmente. A implementação específica é a seguinte classe
pacote util.upload; importar java.io.file; importar java.io.ioException; importar java.io.inputStream; importar java.util.date; importar java.util.properties;/*** excluir o arquivo no servidor**/public TempEmpilement Supplements Runnable Pathn {PathNe "1440"; // O tempo para o armazenamento de arquivos é um dia estático {Properties Prop = new Properties (); InputStream Instrem = tempfilemanager.class.getclassloader () .getResourceasStream ("Execl.properties"); tente {prop.load (instrem); Retention_time = prop.getProperty ("file_retention_time"); } catch (ioexception e) {e.printStackTrace (); } finalmente {tente {Instrem.close (); } catch (ioexception e) {e.printStackTrace (); }}} /*** construtor. Parâmetros de inicialização * @param caminho */ public tempfilemanager (string path) {this.path = path; } / *** Coloque o código que o thread deseja executar em run ()* / public void run () {System.out.println ("Gerenciamento de arquivos START =======================================; Path; Path; Deletefiles (arquivo); se (CandeleteFile (pasta)) {if (pasta.Delete ()) {System.out.println ("pasta" + pasta.getName () + "exclua com sucesso!"); i = 0; que atendam aos critérios if (CandEleteFile (FILE)) {if (FILE.DELETE ()) {System.out.println ("file" + file.getName () + "exclua com sucesso!"); } else {System.out.println ("file" + file.getName () + "excluir falha! Este arquivo pode estar sendo usado"); }} else {}} else {System.out.println ("nenhum arquivo a ser excluído"); }} catch (Exceção e) {System.out.println ("Excluir arquivo falhado =============="); E.PrintStackTrace (); }} / *** Determine se o arquivo pode ser excluído* / Private Boolean CandeleteFile (arquivo de arquivo) {data filedate = getFiledate (arquivo); Data data = new Date (); longo tempo = (date.gettime () - filedate.gettime ()) / 1000 /60 - Integer.parseint (retention_time); // a ata entre o tempo atual e o intervalo de arquivo // System.out.println ("time =="+time); if (horário> 0) {return true; } else {return false; }} / ** * Obtenha o último horário de modificação do arquivo * * @param arquivo * @return * / data privada getFiledate (arquivo file) {long modificou modificou = file.lastmodified (); Data d = nova data (modificada); retornar d; }}Determine se o arquivo cronometrou e a pasta pode ser excluída automaticamente se ele tempo.
O exposto acima é tudo sobre este artigo, espero que seja útil para todos aprenderem a programação Java.