Primeiro, deixe -me apresentar as tecnologias relevantes:
Dois parâmetros importantes no método de serviço.
ServletRequest o usa para receber solicitações de usuário, e sua função é:
Um de seus subinterfaces: javax.servlet.http.httpServletRequest
ServletResponse é usado para retornar dados ao usuário.
Um de seus subinterfaces: javax.servlet.http.httpServletResponse
Tecnologia de download de arquivos:
A tecnologia de download de arquivos é relativamente simples de arquivar a tecnologia de upload. Vamos fazer o download das fotos como exemplo:
Navegue primeiro às fotos e depois faça o download
1. Código front-end:
<span style = "font-size: 14px;"> <a href = "img"> Encontre todas as imagens sob a pasta </a> <br/> </span>
A recepção pode ser feita em apenas uma frase. Pesquise diretamente programas de segundo plano através do web.xml
2. Código de exibição em segundo plano:
<span style = "font-size: 14px;"> public class Showimg estende httpServlet {public void Doget (solicitação httpServletRequest, httpServletResponse resposta) t servletexception, ioexception {<span style = "space branco: pré"> </span> DoPost (solicitação, resposta); // Para evitar exceções, conecte Doget e DoPost juntos} </span> <span style = "font-size: 14px;"> public void DoPost (httpServleTrequest, solicitação de htt pServLeTResponse) lança servleTexception, Ioexception {request.SetchaRACTERENCODING ("UTF-8"); "> <span style =" font-size: 14px; "> // <span style =" white-space: pré "> </span> chame o servletContext, é claro, você também pode chamá-lo diretamente --- Quando listado um por um, o caminho absoluto para o arquivo é necessário quando a imagem é usada </span> ServletContext context = getServletContext (); String Path = context.getRealPath ("/imgs"); // Encontre o caminho absoluto do arquivo de pasta FILE = novo (caminho); "> // <span style =" white-space: pré "> </span> Depois de encontrar a pasta, liste todas as imagens para os usuários navegarem por string files [] = file.list (); para (string fn: arquivos) {</span> <pre nome = "code"> <span style = "font-size: 14px;"> // mostra todos eles </span> String img = "<img src = 'imgs/"+fn+"'/>";
// out.print ("<a href = imgs/'"+fn+"'> baixar imagem </a>"); string str = "<a href = 'down? name = imgs/"+fn+"'> Faça o download da imagem </a> "; // Forneça o hiperlink para download, passe o parâmetro-transfira o nome do arquivo para o conteúdo do link do usuário e escreva.print (str); out.print (img+" <br/ > ");}}
3. Download específico de arquivos
Primeiro, o protocolo correspondente deve ser definido. O protocolo de download requer definir o cabeçalho de download correspondente
<span style = "white-space: pré"> </span> <span style = "font-size: 18px;"> <strong> Response.SetContentType ("Application/Force-download" </strong>);// /Defina o cabeçalho correspondente </span> Ao baixar, você precisa exibir o nome do arquivo da imagem atual.
<span style = "font-size: 18px;"> <span style = "space branco: pré"> </span> outputStream out = Response.getOutputStream (); // Obtenha o nome da string de fluxo de saída = Requee st. getParameter ("Nome"); // O nome do parâmetro passado do atendimento ao cliente é int num = name.LastIndexof ("/"); "Utf- 8"); // se o chinês precisa ser recodificado // system.out.println (aa); forte> anexo; Faça um download específico
<span style = "font-size: 18px;"> string filename = this.getServletContext (). getRealPath (nome); // Obtenha o caminho absoluto, passe o nome do arquivo e, ao mesmo tempo, passe o caminho absoluto que pode ser obtido e você pode lê-lo inputStream em = new FileInputStream (nome do arquivo); {Out.Write (B, 0, Len); Imagem de reprodução:
A renderização depois de clicar:
O nome do arquivo é diferente
Tecnologia de upload de arquivos
Será muito problemático fazer upload de arquivos, para que possamos usar o pacote de outra pessoa para baixar o link e clicar para abrir o formulário de link:
O cliente deve usar o tipo de dados multipart/formulário para representar o tipo de dados composto ao enviar HTTP.
Isto é: <form ENCTYPE = "Multipart/Form-Data">
Use o <input type = "file" name = "someename"/> html tag no formulário.
Pacote necessário:
Commons-FileUpload.jar, a ferramenta de upload de arquivos principais está neste pacote.
Pacote Commons-io.jar necessário para fazer upload de arquivos
Explicação detalhada:
DiskFileItemFactory - Crie um diretório de arquivos de monitoramento temporal, que se refere ao tamanho da área de cache
ServletFileUpload é usado para analisar httpServletRequest. Retorna um conjunto de objetos de arquivo.
O FileItem representa cada objeto de arquivo carregado pelo usuário.
Processo principal:
Arquivo f = novo arquivo ("f:/ex/temp"); // especifique o local de armazenamento temporário de arquivo
DiskFileItemFactory FF = new DiskFileItemFactory (1024*1024*5, f); // O tamanho e o local de armazenamento dos arquivos temporários
ServletfileUpload sf = new ServletFileUpload (FF);
List <FileItem> list = sf.parserequest (request); // iniciar a análise
para (FileItem It: List) {// Obtenha o nome do arquivo. E use UUID para resolver o problema de nomes duplicados
Fileutils.copyInputStreamTofile (it.getInputStream (), novo arquivo (caminho+"/"+nome do arquivo)); // na pasta especificada escrita
}
1. Código da recepção:
<span style = "font-size: 18px;"> <H2> FILHO DE UPLOW </H2> <formulário action = "upfile" method = "post" <span style = "cor:#ff0000;"> rtype = "multipart /Form-Data "</span> // deve ser escrito; caso contrário, a estação não pode receber dados <!-this ENCTYPE =" Multipart/Form-Data "---> file1 <input type =" arquivo "< span style = "cor:#ff6666;"> name </span> = "arquivo"/> <br/> Por favor, digite um nome: <input type = "text" <span style = "cor:#ff6666;"> nome </span> = "desc"/> <br/> file2 <input type = "file" <span style = "cor:#ff6666;"> name </span> = "file"/> <br/> Por favor, digite um nome: <input type = "text" <span style = "cor:#ff0000;"> name </span> = "desc"/> <br/> <input type = "submit" value = "submit" "/> </morm> </span>
2. Código de fundo:
2-1 Primeiro, crie uma fábrica baseada em disco rígido para armazenar arquivos temporários
// especifique o arquivo de localização de armazenamento temporário f = novo arquivo ("f:/ex/temp"); // especifique o localização de armazenamento temporário diskFileItemFactory ff = new DiskFileItemFactor Arquivo temporário e local de armazenamento2-2 Crie um objeto ServletFileUpload e defina o tamanho do arquivo para maximizar a transferência de arquivo
// Crie um objeto para analisar o servletfileUpload sf = new ServletfileUpload (FF); *20);
2-3 Comece a analisar o objeto
<span style = "space branco: pré"> </span> list <FileItem> list = sf.parserequest (request); // obtenha todas as informações transmitidas da recepção, a recepção deve preencher o ENCTYPE = "Multiparte /Form- Dados "para (FileItem It: List) {it0 = it; // <span style =" white-space: pre "> </span> se for um objeto de forma normal-você pode julgar diretamente se ( it.isformfield ()) {// é um item de formulário normal, como tipo = nome do texto Nome da string = it.getString ("utf-8"); +nome); // abaixo do nome da explicação escrita} else {<span style = "white-space: pré"> </span> // Este é o nome do arquivo selecionado pelo nome da string da recepção = it.getName (); // O caminho do arquivo específico--Absolute Path // String str = it.getString (); // Conteúdo no arquivo // System.out.println ("str"+str); .getContentType (); <pré-nome = "code" style = "font- tamanho: 18px;"> // <span style = "white-space: pre"> </span> O nome do arquivo de recurso no lado do servidor não pode ser em chinês, o O navegador o codificará automaticamente --------------------------------------------- -------------------------------------------------------- -------------------------------------------------------- -------------------------------------------------------- ------------ O nome do arquivo carregado é convertido em um nome sem armazenamento chinês. O nome do mapeamento deve ser armazenado e depois convertido quando o usuário baixar. // o nome do mapa string id = uuid.randomuuid (). Tostring (). Substituir ("-", ""); // o único uuid do mundo é usado para // Nome do arquivo string lastName = name.substring (nome. lastIndexOF (".")); // formato de arquivo // Os formatos de arquivo são encontrados --- combinação string filename = id+lastName; // novo nome do arquivo // fluxo de copiar. Deixe-o gravar no local correspondente FileUtils.copyInputStreamTofile (it.getInputStream (), novo arquivo (caminho+"/"+filename)); // caminho é o caminho absoluto do armazenamento-definido anteriormente}}
Isso pode obter uploads simples, mas esse tipo de upload não é seguro. O código completo está anexado a pequenos problemas para evitar problemas gerais.
Depois de selecionar o arquivo
Verifique os arquivos no IMG do servidor da web, o arquivo foi enviado para a página "Nome do arquivo gerado por UUID"
Código fonte do upload de arquivo:
<span style = "font-size: 14px;"> pacote cn.hncu.upfile; importar java.io.file; Java .Teril.List; .APACH .Commons.FileUpload.Fileitem; Apache.Commons .io.FileUtils; Sem resposta <span style = "espaço branco: pre;"> </span> @Override <span style = "white-space: pre;"> </span> Void protegido Doget (httpServletRequest req, http servletResponse resp) < span style = "espaço branco: pre;"> </span> lança servletexception, ioexception {<span style = "espaço branco: pre;"> </span> resp.setContentType ("utf-8"); span style = "espaço branco: pre;"> </span> writer wr = resp.getwriter (); Método suportado e upload "); <span style =" space branco: pre; "> </span>} <span style =" white-space: pre; "> </span> <span style =" space branco : pré; "> </span> public void DoPost (solicitação httpServletRequest, httpServletResponse resposta) <span style =" space branco: pre; "> </span> lança servletexception, ioexception {<span style =" space branco: pré; "); <span style =" white-space: pre; "> </span> printWriter out = Response.getWriter (); <span style =" white-space: pre; "> </span> // proteger para Método de Upload de Formulários Normais 1: <Span style = "White-Space: Pre;"> </span> // Valor de retorno Get (NULL) Post1 (Apllication/X-Form-Urlencoded, forma normal) Post2 (Arquivo: Multipart/ Dados de formulário, formulário de upload de arquivo) // <span style = "espaço branco: pre;"> </span> string type = request.getContentType (); > </span> se das formas normais 2 "); // <span style =" space branco: pre; "> </span> retornar; // <span style =" space branco: pre; "> </span>} <span style = "espaço branco: pre;"> </span> // método 2 <span style = "space branco: pre;"> </span> boone boo = servletfileUpload.ismultipartContent (solicitação); "White- Space: pre;"> </span> if (boo == false) {<span style = "white-space: pre;"> </span> out.print ("Upload 1 de formas normais não é suportado "); <span style =" white-space: pre; "> </span> <span style =" white-space: pre; "> </span>} <span style =" space branco: pré; "> </span>} span> <span style =" white-space: pre; "> </span> // especificar localização temporária de armazenamento <span style =" white-space: pre; "> </span> arquivo f = novo arquivo ("f:/ex/temp"); // especifique o local de armazenamento temporário de arquivo <span style = "white-space: pre;"> </span> diskFileItemFactory ff = new DiskFileItemFactory (1024*1024* 5, f); // Tamanho temporário do arquivo e localização de armazenamento <span style = "White-space: pre;"> </span> <span style = "space branco: pre;"> </span> // crie um objeto para análise <span style = "espaço branco: pre;"> </span> servletfileUpload sf = new ServletfileUpload (ff); (1024*1024*10); // O valor máximo de apenas um local de armazenamento é 10m <span style = "White-space: pre;"> </span> sf.SetSizemax (1024*1024*20);// /O valor máximo de todos os arquivos é 20m <span style = "space branco: pre;"> </span> string path = this.getServletContext (). GetRealPath ("/imgs"); Espaço: pré; "> </span> System.out.println (" Caminho de armazenamento: "+caminho); <span style =" white-space: pre; "> </span> // iniciar a análise <span style = "Espaço branco: pre;" "Space branco: pré;"> </span> list <FileItem> list = sf.parserequest (request); // obtenha todas as informações transmitidas da recepção, a recepção deve preencher o ENCTYPE = "Multipart/Form- Dados "<span style =" White- Space: pre; "> </span> para (FileItem It: List) {<Span style =" White-Space: Pre; "> </span> it0 = it; <span style = "espaço branco: pre;"> </span> if (it.isformfield ()) {// é um item de formulário normal, como tipo = valor de texto do nome <span style = "white-space: pré ; "> </span> string name = it.getString (" utf-8 "); <span style =" white-space: pre; "> </span> System.out.println (" Nome do item do formulário básico: "+nome); // escrito abaixo do nome da explicação é <span style =" white-space: pre; "> </span>} else {<span style =" space branco: pre; "> </ span> string name = it.getName ();//caminho de arquivo específico // <span style = "space branco: pre;"> </span> string n1 = it.getfieldName (); "Espaço branco: pre;"> </span> string str = it.getString (); // o conteúdo no arquivo // <span style = "space branco: pre;"> </span>. out.println ("str"+str); -Space: pre; "> </span> string contentType = it.getContentType (); <span style =" espaço branco: pre; "> </span> size longo = it.getSize (); <span style = "Espaço branco: pre;"> </span> // impedem que o arquivo seja esvaziado <span style = "white-space: pre;"> </span> if (size == 0) {<span style = " Espaço branco: pré; "> </span> continue; // o arquivo está vazio, retorna diretamente; <span style =" white-space: pre; "> </span>} <span style =" branco-espaço : pre; "> </span> // nome de usuário. Você deve preencher <span style = "white-space: pre;"> </span> if (name == null || name.trim () == "") {<span style = "white-space: pré ; "Espaço branco: pre;"> </span> System.out.println (nome+","+contentType+"," Size); / O nome do arquivo do recurso no lado do servidor não pode estar em chinês, o navegador o codificará automaticamente -------------------------------------- -------------------------------------------------------- -------------------------------------------------------- -------------------------------------------------------- -------------------------------------------------------- ------> </span> // Para permitir que os usuários restaurem seu nome original ao fazer o download, eles devem armazenar a correspondência entre o nome do arquivo original e o nome do mapeamento e convertê-lo quando o usuário baixar. pre; "> </span> // nome do mapeamento <span style =" white-space: pre; "> </span> string id = uuid.randomuuid (). tostring (). substituir ("-"," " ); ("."); </span> string filename = id+lastName; Deixe-o escrever no local correspondente <span style = "white-space: pre;"> </span> fileutils.copyInputStreamTofile (it.getInputStream (), novo arquivo (caminho+"/"+nome do arquivo));} <estilo span = "Espaço branco: pré;"> </span>}} catch (fileUploadexception e) {<span style = "space branco: pre;"> </span> lança nova runimeException ("Erro de análise de upload do arquivo". + e); span style = "espaço branco: pre;"> </span> it0.delete (); // excluir arquivo temporário <span style = "space branco: pre;"> </span>}} out.close ( );}} </span> <span style = "font-size: 18px;"> </span> Download do arquivo Código fonte: [html] Exibir PlainCopyPrint? <span style = "font-size: 14px;"> pacote CN .HNCU.DOWNIMG; . Resposta de Setre -Response) joga Servletexcepti, ioexception {DoPost (request, resposta); Envie o nome de usuário para a recepção/*Transfira a sequência de usuário fixa aa = "1.jpg"; // se estiver em chinês, você precisa codificar aa = urlencoder.encode (aa, "utf-8"); Response.setheader ("Content-Disposition", "Anexamento; nome do arquivo = ''"+AA+"'"); ///// você deve adicionar "anexo", caso contrário, ele se tornará uma navegação*/outputStream Out = Response. getOutputStream (); // Obtenha o nome da string de saída = Solicitação. Substring (NUM+1); Disposição "," anexo; nome do arquivo = '"+aa+"' "); // Receba o nome do arquivo a partir daí para que possa ser baixado ao armazenar string filename = this.getServletContext (). GetRealPath (nome); // Obtenha o caminho absoluto inputStream em = novo FileInputStream (nome do arquivo); Write (b, 0, len);}}} </span> <span style = "font-size: 18px;"> </span>O exposto acima é tudo sobre este artigo, espero que seja útil para o aprendizado de todos.