O upload e o download de arquivos são problemas comuns encontrados no desenvolvimento da Web. Nos últimos dias, o download de arquivos foi usado em um projeto. Também fiz algumas anotações de maneira dispersa antes. Hoje vou organizá -lo. O upload de arquivos precisa de testes adicionais, vamos falar sobre o download de arquivos primeiro.
1. Processo de processamento de download de arquivos
O processo de download de arquivos é realmente muito claro, ou seja:
1. Localize os arquivos com base no nome do arquivo ou no caminho do arquivo. A estratégia específica é baseada principalmente em suas próprias necessidades. Em resumo, é necessário o caminho completo dos arquivos que o sistema pode encontrar.
2. Obtenha o fluxo de entrada e obtenha o fluxo de entrada do arquivo de destino.
3. Obtenha o fluxo de saída e obtenha o fluxo de saída da resposta.
4. Leia o arquivo a partir do fluxo de entrada e saia o arquivo através do fluxo de saída. Este é o verdadeiro processo de execução de download.
5. Desligue o fluxo de IO.
Este é o processo principal, e existem algumas configurações de atributos necessárias, como o tipo de conteúdo mais importante do arquivo de configuração, etc.
2. Não fale mais, adicione o código
Eu fiz isso com o SpringMVC, mas, na verdade, o mesmo se aplica a outras coisas. Eu preciso principalmente do objeto HttpServletResponse e arquivo de destino válido.
1. Código da recepção
/** Faça o download do arquivo carregado*/função DownloadFromUpload (nome do arquivo) {Window.Location.Href = Path + "/Download? Dir = Upload & FileName =" + Encodeuri (Encodeuri (nome do arquivo); "/Download? Dir = Download & FileName ="+Encodeuri (Encodeuri (nome do arquivo));}2. Código do controlador
/*** Download do arquivo (download do caminho do upload)** @param request* @param Resposta* @THOWSows IoException*/ @ResponseBody @requestmapping (value = "/download") public void DownloadFile (httpServletRequest Solicy, httpSletResponse Response, modelModel Model). "UTF-8");/** Restrinja apenas os arquivos nas pastas de upload e download podem ser baixados*/String FolderName = "Download"; if (! StringUtils.isEmpty (Model.getDir ()) && Model.getdir (). request.getSession (). getServletContext (). getRealPath ("/")+ "/web-inf/"+ FOLDERNAME+ "/"+ FILENAME; FILETOOLS.DOWNLOADFILE (Solicitação, Resposta, FileAbsolutePath); Log.warn ("UserID:"+ (integger) (solicitação.getSession. (request.getSession (). getAttribute ("nome de usuário")) + ", arquivo baixado:" + FileAbsolutepath);}A lógica de download aqui é que a recepção precisa apenas solicitar/baixar e fornecer os parâmetros do nome do arquivo. Para evitar o código ilegal chinês, quando o nome do arquivo em primeiro plano é usado como um parâmetro, ele usa o JS 'Codeuri () para alterá -lo no código Unicode e depois o decodifica para chinês. Além disso, devido à natureza especial do projeto, os arquivos que quero baixar aqui podem estar nas pastas de upload e download, para que haja uma parte da lógica do julgamento aqui. Além disso, encapsulei o nome do arquivo e o nome da pasta solicitada no FileModel.
3. Baixe a implementação da lógica.
Não há serviço aqui, mas é implementado diretamente usando métodos estáticos.
/*** Especifique o nome do download ao baixar o arquivo** @param request* httpServletRequest* @param Resposta* httpServletResponse* @param filepath* caminho completo do arquivo* @param filename* especifique o nome do arquivo exibido quando o cliente downloads* @Throws IoException*/public STATIDFILE downloadfille String filepath, string fileName) lança ioexception {bufferingInputStream bis = null; bufferoudOutputStream bos = null; bis = new bufferInputStream (new FileInputStream (filepath); Arquivo (filepath) .Length (); Response.SetcharActerencoding ("UTF-8"); Response.SetContentType ("Multipart/Form-Data");/** Resolva o problema chinês de cada navegador*/string userAgent = request.GETHEDER ("User-Agent"); byte [] porTes (string userAgent = string. filename.getBytes (): filename.getBytes ("utf-8"); // filename.getbytes ("utf-8") lida com problemas de código embaralhados no safari filename = new string (bytes, "ISO-8859-1"); // Todos os navegadores suportam basicamente a resposta de codificação ISO.setheader ("Content-Disposition", string.format ("anexamento; nome do arquivo =/"%s/"", nome do arquivo); resposta.setheader ("content-length", string.valueof (fileLelgth); bis.read (buff, 0, buff.length))) {bos.write (buff, 0, bytesread);} bis.close (); bos.close ();}/*** o nome do arquivo de download não é especificado ao baixar o arquivo** @param* request* httpsenstleTerequest* @param Response* htTers* httpers* @param* request* Ioexception*/public static void Downloadfile (solicitação httpServletRequest, resposta httpServletResponse, string filepath) lança ioexception {file file = new File (filepath); downloadfile (solicitação, resposta, filepath, filepath.getName ());}Aqui está um método de download sobrecarregado para resolver a necessidade de especificar o nome do arquivo baixado pelo cliente.
3. Coisas para observar
1. Sobre a escolha do tipo MIME
Eu não sabia muito sobre os tipos de MIME antes, mas descobri que existem muitos códigos de origem baixados na Internet que têm configurações diferentes. Essa é esta frase
Response.setContentType ("Multipart/Form-Data");Eu verifiquei se uma das funções de definir o tipo MIME aqui é dizer ao navegador do cliente para processar o arquivo a ser baixado em qual formato. Existem muitas explicações no site correspondente específico. Se esse tipo de classe I estiver definido neste formato, o formato geralmente será correspondido automaticamente.
2. Especifique o nome do arquivo do download do cliente
Às vezes, podemos precisar especificar o nome do arquivo quando o cliente baixar o arquivo, ou seja, este código
Response.setheader ("Content-Disposition", String.Format ("anexamento; nome do arquivo =/"%s/"", nome do arquivo));
o nome do arquivo nele pode ser personalizado. A parte da frente não deve ser movida.
3. Resolva o problema de chinês ilegal
É muito comum que os arquivos chineses sejam iluminados. Quando a arquitetura do sistema do projeto é construída pela primeira vez, todas as codificações chinesas devem ser unificadas, inclusive no editor, página e banco de dados. A codificação UTF-8 é recomendada. Se você estiver usando o Spring, também poderá configurar o filtro de conjunto de personagens da Spring para evitar o código ilegal chinês.
(1) O nome do arquivo do processo de solicitação de download do cliente está iluminado
Às vezes encontramos isso. Quando a página da recepção exibe a lista de downloads do nome do arquivo chinês, é normal, mas quando vamos ao plano de fundo, descobrimos que o nome do arquivo na solicitação está iluminado. Neste momento, podemos usar o codori mencionado acima para resolver o problema.
(2) Nome do arquivo grudou quando o cliente faz o download e executa
Nos testes reais, verificou -se que, quando outros navegadores podem executar, o nome do arquivo chinês no IE pode parecer iluminado. Eu vi um pedaço de código online. Após o teste, resolveu perfeitamente o problema dos chineses iluminados em diferentes navegadores.
/** Resolva o problema chinês de cada navegador*/string userAgent = request.getheader ("user-agent"); byte [] bytes = userAgent.contains ("msie")? filename.getBytes (): filename.getBytes ("utf-8"); // filename.getbytes ("UTF-8") lida com o problema de Safari nome do safari = new String (bytes, "ISO-8859-1"); // Todos os navegadores basicamente suportam o ISO Coding Response.setheader ("Content-Disposition", String.Format ("Applement; nome do arquivo =/"%s/"", nome do arquivo));(3) Arquivo iluminado no servidor
Servidores diferentes também podem ser diferentes, dependendo da plataforma, portanto, você precisa prestar atenção aqui. Para soluções específicas, consulte um artigo que escrevi antes: Processamento chinês Durbled durante o download de arquivos.
O exposto acima é o download do arquivo de implementação da Web Java e o método de processamento ilegal introduzido pelo editor. Espero que seja útil para você. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a você a tempo. Muito obrigado pelo seu apoio ao site wulin.com!