Este artigo compara dois exemplos de upload de arquivos para ajudar todos a aprender melhor a função de upload de arquivos Java. O conteúdo específico é o seguinte
1. Código de upload de anexo Java
@ControllerPublic Class UploadFile estende BASEJSONCONTROLLER {/** * Upload de anexo * * @Param Request * @param Creativefile * @param Response * @return */@requestMapping (valueTPERTLETLETLETLETLETLETLETLESTRETLET (/upload/uploadfile.json) Void público * 1. Para garantir a segurança do servidor, o arquivo carregado deve ser colocado em um diretório que não possa ser acessado diretamente pelo mundo exterior, como no diretório Web-Inf. * 2. Para evitar a sobrescrição do arquivo, um nome de arquivo exclusivo deve ser gerado para fazer upload do arquivo. * 3. Para evitar que muitos arquivos apareçam em um diretório, você deve usar o algoritmo de hash para interromper o armazenamento. * 4. O valor máximo dos arquivos carregados deve ser limitado. * 5. Para limitar o tipo de arquivos enviados, ao receber o nome do arquivo carregado, determine se o nome do sufixo é legal. */// Obtenha o diretório Salvar arquivo carregado, armazenar o arquivo carregado no diretório Web-Inf e não permite o acesso direto do mundo exterior para garantir a segurança dos arquivos carregados string stringpath = request.getSession (). GetServletContext (). GetRealPath ("/web-inf/upload"); // o diretório de economia de arquivos temporário gerado durante o upload string temppath = request.getSession (). GetServletContext (). GetRealPath ("/web-inf/temp"); Arquivo tmpfile = novo arquivo (temppath); if (! tmpfile.exists ()) {// crie um diretório temporário tmpfile.mkdirs (); } // A mensagem solicita jsonArray arr = new jsonArray (); Mapa <string, objeto> map = null; InputStream in = null; FileOutputStream Out = NULL; tente {// use o componente de upload do arquivo Apache para lidar com etapas de upload de arquivo: // 1. Crie uma fábrica de fábrica DiskFileItemFactory DiskFileItemFactory Factory = new DiskFileItemFactory (); // Defina o tamanho do buffer da fábrica. Quando o tamanho do arquivo carregado excede o tamanho do buffer, um arquivo temporário será gerado e armazenado no diretório temporário especificado. Factory.SetSizETHreshold (1024*100); // Defina o tamanho do buffer como 100kb. Se não for especificado, o tamanho do buffer é de 10kb por padrão. // Defina o diretório de armazenamento do arquivo temporário gerado durante o upload da fábrica.setRepository (tmpfile); // 2. Crie um arquivo de upload de upload de arquivo servletfileUpload upload = new ServletFileUpload (Factory); // Supert o arquivo de upload do arquivo upload.setProgressListener (new ProgressListener () {public void update (pbytesread longo, longo pcOntentLength, int arg2) {System.out.println ("tamanho do arquivo é:" + pcontentLength + ", atualmente processado:" + pbytesread); // Resolva o upload chinês e o upload.setheadeRencoding ("UTF-8"); // 3. Determine se os dados enviados são os dados do formulário de upload if (! ServletFileUpload.ismultipartContent (request)) {// Obtenha os dados retornar de acordo com a maneira tradicional; } // Defina o tamanho máximo do arquivo único carregado, que está atualmente definido como 1024*1024 bytes, ou seja, 20MB upload.setFilesizEMAX (1024*1024*20); // Defina o valor máximo do número total de arquivos carregados. O valor máximo = a soma dos tamanhos máximos de vários arquivos enviados ao mesmo tempo. Atualmente, ele está definido como 40MB upload.SetSizEMAX (1024*1024*40); // 4. Use o analisador ServletFileUpload para analisar os dados enviados. O resultado da análise retorna uma lista <FileItem>. Cada FileItem corresponde ao item de entrada de um formulário de formulário @suppresswarnings ("desmarcado") list <FileItem> list = upload.parserequest (request); para (Item FileItem: List) {// Se os dados dos itens de entrada ordinários forem encapsulados no arquivo if (item.isformfield ()) {string name = item.getfieldName (); // Resolva o problema chinês ilegal dos dados de itens de entrada ordinários String Value = item.getString ("UTF-8"); // valor = new String (value.getBytes ("ISO8859-1"), "UTF-8"); System.out.println (nome + "=" + valor); } else {// Se o item do arquivo estiver encapsulado no arquivo carregado // Obtenha o nome do arquivo carregado, string filename = item.getName (); if (nome do arquivo == null || filename.trim (). Equals ("")) {continue; } // Nota: Os nomes de arquivos enviados por diferentes navegadores são diferentes. Alguns navegadores enviam nomes de arquivos com caminhos, como: c: //b/1.txt, enquanto alguns são apenas nomes de arquivos simples, como: 1.txt // processam a parte do caminho do nome do arquivo do arquivo uploado obtido, apenas a peça do nome do arquivo é retida o nome do arquivo = nome do arquivo. // Obtenha a extensão do arquivo carregado string fileExtName = filename.substring (filename.lastIndexof (".")+1); // Se você precisar limitar o tipo de arquivo carregado, poderá usar a extensão do arquivo para determinar se o tipo de arquivo carregado é legal se (StringUtils.Equals (FileExtName, "rar") || stringUtils.Equals (FileExtName, "zip")) {Throw New Bizexception ("", "Atualizar arquivos compactados é proibido! } /*************** /// Obtenha o fluxo de entrada do arquivo carregado no item = item.getInputStream (); /******************/// Obtenha o nome do arquivo salvo String saveFileName = makefilename (nome do arquivo); // Obtenha o arquivo salvar diretório string realSavePath = MakePath (saveFileName, savePath); // Crie um fluxo de saída de arquivo OUT = new FileOutputStream (RealSavePath + "//" + saveFileName); // crie um buffer buffer buffer [] = novo byte [1024]; // A identificação de se os dados no fluxo de entrada foram lidos são int len = 0; // O loop lê o fluxo de entrada no buffer, (len = in.read (buffer))> 0 significa que ainda existem dados em while (len = in.read (buffer))> 0) {// use fileOutputStream Output Stream para gravar os dados do buffer no diretório especificado (savepath + "//" + filename) } // Fechar o fluxo de entrada em.close (); // Fechar o fluxo de saída fora.close (); // Exclua o arquivo temporário gerado ao processar o arquivo de upload item.delete (); map = novo hashmap <string, object> (); map.put ("savefilename", savefilename); map.put ("RealSavePath", RealSavePath); Arr.add (mapa); }} returnSuccessjson ("uploadBase.FilesizElimitexEdEdException e) {E.PrintStackTrace (); returnFailjson (e.getMessage ()," FILE ÚNICO EXECECE O VALOR MAXIMENTO! ", Resposta);} Catch (FileUPLOADBase.SizElimitexExcembexcext); ReturnFailjson (E.GetMessage (), o tamanho total do arquivo carregado excede o limite máximo! ", Resposta); in.close (); @return uuid + "_" + o nome original do arquivo */private string makefilename (string filename) {//2.jpg // Para impedir a substituição de arquivos, um nome de arquivo exclusivo deve ser gerado para fazer o upload do arquivo retornar uuid.randomuuid (). tostring () + "_" + arquivo; } / ** * Para impedir que muitos arquivos apareçam em um diretório, você precisa usar o algoritmo de hash para interromper o armazenamento * @Method: MakePath * @Description: * @Anthor: Xuwenta @parampathpath stormath storage storage storage name name de arquivo, gerar armazenamento Directory com base no nome do arquivo * @parampath Salão de armazenamento * // Obtenha o valor HashCode do nome do arquivo, e o que você obtém é o endereço do nome do objeto String em Memory int hashcode = filename.hashcode (); int dir1 = hashcode & 0xf; // 0--15 int Dir2 = (HashCode & 0xf0) >> 4; // 0-15 // Construa um novo diretório de salvamento string dir = salvath + "//" + dir1 + "//" + dir2; // O arquivo upload/2/3 upload/3/5 // pode representar o arquivo de arquivos e diretórios Arquivo = novo arquivo (dir); // se o diretório não existir se (! File.exists ()) {// crie o diretório file.mkdirs (); } retornar dir; }}2. Código de currículo de upload java
/ ***Registro de upload*A criação de 1 arquivo falhou 2-Exceição com 3-Upload Falha 4-File não obtida 5 arquivos não excluídos 6-PORTUMANTE WORD, Excel, PPT, arquivos pdf*//*Separador de caminho) Usado no sistema operacional adaptativo*/ private static string file_separator = System.getProperties (). / ** * Arquivo de upload * * @param fileio * @param OldContracturl * @param request * @return Retornar Endereço do arquivo (endereço relativo, endereço não absoluto) */ @Override public String upload (multipartFile Fileio, string antigoCractUrl, httpSletLeTrequest Solict) {StringLouRl =. // Excluir arquivos e pastas if (OldContRurl! = NULL) {String OldDirectory = OldContRurl.substring (5, OldContracturl.LastIndexOf (file_separator)); Arquivo de arquivo = novo arquivo (uploadURL + OldDirectory); bandeira booleana = deletedir (arquivo); if (! flag) {Logger.error ("A exclusão de arquivo antigo falhou"); retornar "5"; }} // Carregar novo arquivo de currículo long now = System.currenttimemillis (); uPLOURL = UPLOURL + FILE_SEPARATOR + NOW + FILE_SEPARATOR; String resumename = ""; if (! fileio.isEmpty ()) {resumename = stringUtils.deletewhitespace (FILEIO.GETORGINALFILENAME ()); // Juiz Arquivo Sufixo/*String sufix = resumename.substring (resumename.lastIndexOf ("."), ResumeName.Length ()) .TolowerCase (); if (! ". Doc" .Equals (sufixo) &&! ". Docx" .Equals (sufixo) &&! ". xlsx" .equals (sufixo) &&! ". xlsx" .equals (sufix) &&! ". ppt" .equals (sufixo) & & &! Logger.error ("Não Word, Excel, PPT, Arquivos PDF"); retornar "6"; }*/} else {Logger.error ("arquivo não obtido"); retornar "4"; } Arquivo dir = novo arquivo (uPLOPLURL); if (! Dir.Exists ()) {Dir.mkdirs (); } Arquivo targetfile = novo arquivo (uPLOURL + resumename); if (! TargetFile.Exists ()) {Try {TargetFile.CreateNewFile (); } catch (ioexception e) {logger.error ("criação de arquivos falhou", e); retornar "1"; }} tente {fileio.transferto (TargetFile); } catch (ilegalStateException e) {Logger.error ("Exceção da frase", e); retornar "2"; } catch (ioexception e) {logger.error ("upload falhou", e); retornar "3"; } retornar file_separator + "arquivos" + file_separator + agora + file_separator + resumename; } /*** Exclua recursivamente todos os arquivos no diretório e todos os arquivos nos subdiretos* @param dir O diretório de arquivos a ser excluído* @return boolean retorna "true" se todas as exclusões tiverem sido bem -sucedidas. * Se uma exclusão falhar, o método para de tentar * excluir e retornar "false". */ public boolean DeLetedir (arquivo de arquivo) {if (dir.isdirectory ()) {string [] children = Dir.List (); // excluem recursivamente os subdiretos no diretório para (int i = 0; i <children.length; i ++) {sucesso booleano = deletedir (novo arquivo (dir, crianças [i])); if (! succcess) {return false; }}} // O diretório está vazio neste momento, você pode excluir o retorno Dir.Delete (); }O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para aprender e dominar as habilidades de fazer upload de arquivos Java.