Vejamos primeiro o exemplo mais simples de download de arquivo:
Copie o código do código da seguinte forma:
pacote com.yyz.response;
importar java.io.FileInputStream;
importar java.io.IOException;
importar java.io.OutputStream;
importar javax.servlet.ServletException;
importar javax.servlet.http.HttpServlet;
importar javax.servlet.http.HttpServletRequest;
importar javax.servlet.http.HttpServletResponse;
//Baixar arquivo
classe pública ResponseDemo estende HttpServlet {
public void doGet (solicitação HttpServletRequest, resposta HttpServletResponse)
lança ServletException, IOException {
String realpath = this.getServletContext().getRealPath("/download/1.gif");
String nome do arquivo = realpath.substring(realpath.lastIndexOf("//")+1);
response.setHeader("disposição de conteúdo", "anexo;nome do arquivo="+nome do arquivo);
//O servidor usa este cabeçalho para informar ao navegador para abrir os dados no modo de download
FileInputStream in = new FileInputStream(caminhoreal);
int len = 0;
buffer de bytes[]=novo byte[1024];
OutputStream out=response.getOutputStream();
while((len = in.read(buffer))>0){
out.write(buffer, 0, len);
}
in.close();
//Não há necessidade de fechar. Quando a resposta for destruída, o servidor fechará automaticamente o fluxo relacionado à resposta.
}
public void doPost (solicitação HttpServletRequest, resposta HttpServletResponse)
lança ServletException, IOException {
doGet(solicitação,resposta);
}
}
A função deste código é baixar a imagem 1.png do servidor. A estrutura de diretórios é exibida da seguinte forma usando o explorador de pacotes do MyEclipse:
Vamos tornar isso um pouco mais difícil. O arquivo que queremos baixar é um arquivo com nome chinês. Como as coisas no arquivo de cabeçalho no protocolo http só podem ser caracteres ASCII, o método acima (altere diretamente String realpath = this.getServletContext().getRealPath("/download/1.gif"); para String realpath = this . getServletContext().getRealPath("/download/picture.gif");) Obtenha o arquivo diretamente,
Haverá problemas de código distorcido. Em anexo estão os resultados dos testes:
Para resolver este problema, use o método encode da classe URLEncoder:
Copie o código do código da seguinte forma:
pacote com.yyz.response;
importar java.io.FileInputStream;
importar java.io.IOException;
importar java.io.OutputStream;
importar java.net.URLEncoder;
importar javax.servlet.ServletException;
importar javax.servlet.http.HttpServlet;
importar javax.servlet.http.HttpServletRequest;
importar javax.servlet.http.HttpServletResponse;
//Ao baixar arquivos em chinês, os nomes dos arquivos em chinês devem ser codificados em URL.
classe pública ResponseDemo estende HttpServlet {
public void doGet (solicitação HttpServletRequest, resposta HttpServletResponse)
lança ServletException, IOException {
String realpath = this.getServletContext().getRealPath("/download/picture.gif");
String nome do arquivo = realpath.substring(realpath.lastIndexOf("//")+1);
response.setHeader("disposição de conteúdo", "anexo;nome do arquivo="+URLEncoder.encode(nome do arquivo,"UTF-8"));
//Esta função codifica a string em URL
FileInputStream in = new FileInputStream(caminhoreal);
int len=0;
buffer de bytes[]=novo byte[1024];
OutputStream out=response.getOutputStream();
while((len = in.read(buffer))>0){
out.write(buffer, 0, len);
}
in.close();
}
public void doPost (solicitação HttpServletRequest, resposta HttpServletResponse)
lança ServletException, IOException {
doGet(solicitação,resposta);
}
}
Em anexo estão os resultados dos testes:
Além disso, há um pequeno detalhe que todos precisam prestar atenção:
FileReader não pode ser usado em vez de FileInputStream. Os dados serão perdidos ao usar o FileReader. O motivo é o seguinte: FileReader é um fluxo de caracteres e dados como imagens e arquivos de mídia são armazenados no formato 01. Ao ler com o FileReader, você precisa consultar uma tabela de codificação. a codificação não é especificada. A codificação padrão para a plataforma correspondente é usada. Por exemplo, os computadores na China verificarão o GB2312. Quando um código que não existe na tabela de códigos GB2312 é lido, os dados serão codificados em '? ', os dados se tornarão chineses e '? 'Mistura. Após enviá-lo ao cliente, verifique novamente a tabela de códigos ao exibi-la e substitua todos os códigos '?' por '?' Apenas lembre-se de uma coisa sobre esse detalhe: fluxos de bytes podem lidar com qualquer tipo de dados, fluxos de caracteres só podem lidar com dados de caracteres.