1. A maneira mais direta e simples é colocar o endereço do arquivo diretamente em um link da página html. A desvantagem disso é que o caminho do arquivo no servidor fica exposto e outros controles (como permissões) nos downloads de arquivos não podem ser executados. Não vou escrever um exemplo aqui.
2. No lado do servidor, o arquivo é convertido em um fluxo de saída, gravado na resposta e o arquivo é levado ao navegador com a resposta. O navegador pergunta ao usuário se ele deseja salvar o arquivo localmente. (exemplo abaixo)
<%
resposta.setContentType(fileminitype);
resposta.setHeader("Localização",nome do arquivo);
response.setHeader("Cache-Control", "max-age=" + cacheTime);
response.setHeader("Content-Disposition", "attachment; filename=" + filename); //nome do arquivo deve ser codificado (utf-8)
resposta.setContentLength(comprimento do arquivo);
OutputStream outputStream = resposta.getOutputStream();
InputStream inputStream = new FileInputStream(caminho do arquivo);
byte[] buffer = novo byte[1024];
int eu = -1;
enquanto ((i = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, i);
}
outputStream.flush();
saídaStream.close();
inputStream.close();
fluxo de saída = null
;
3. Por ser JSP, outra forma é usar o Applet para baixar arquivos. No entanto, o cliente deve primeiro confiar no seu miniaplicativo Applet, que aceitará o fluxo de dados enviado pelo servlet e o gravará localmente.
exemplo do lado do servlet
serviço público vazio (requisição HttpServletRequest, resposta HttpServletResponse)
lança ServletException, IOException {
res.setContentType("texto/simples");
OutputStream outputStream = null;
tentar {
outputStream = res.getOutputStream();
popFile(srcFile, outputStream));//Escreve o arquivo com o caminho do arquivo srcFile no outputStream.
} catch (IOException e) {
e.printStackTrace();
}
}
Exemplo do lado JApplet
URLConnection con;
tentar {
con = url.openConnection();//url é a URL do SERVLET chamado, como http://localhost:8080/sendDateSevlet.do
con.setUseCaches(falso);
con.setDoInput(true);
con.setDoOutput(true);
con.setRequestProperty("Tipo de conteúdo",
"aplicativo/fluxo de octeto");
InputStream in = con.getInputStream();
ProgressMonitorInputStream pmInputStream = novo ProgressMonitorInputStream(
painel, "Baixando o conteúdo do arquivo do servidor", em);
ProgressMonitor pMonitor = pmInputStream
.getProgressMonitor();
pMonitor.setMillisToDecideToPopup(3);
pMonitor.setMillisToPopup(3);
String localfilepath = localstr + filename; //localfilepath caminho local, pasta de arquivo localstr, nome do arquivo nome do arquivo local
if(saveFilsaveFilee(localfilepath,pmInputStream)){ //O método saveFilsaveFilee grava o fluxo de entrada pmInputStream no arquivo localfilepath.
openLocalFile(localfilepath);
}
4. A propósito, o código do JApplet para fazer upload de arquivos também foi postado.
Exemplo do lado JApplet
URLConnection con;
tentar {
con = url.openConnection();//url é a URL do SERVLET chamado, como http://localhost:8080/sendDateSevlet.do
con.setUseCaches(falso);
con.setDoInput(true);
con.setDoOutput(true);
con.setRequestProperty("Tipo de conteúdo",
"aplicativo/fluxo de octeto");
OutputStream out = con.getOutputStream();
String localfilepath = localstr + filename; //localfilepath caminho local, pasta de arquivo localstr, nome do arquivo nome do arquivo local
getOutputStream(localfilepath,out);//O arquivo getOutputStream grava o arquivo localfilepath no fluxo de saída out.
InputStream in = con.getInputStream();
retornar verdadeiro;
}catch(IOException e){
System.out.println("Erro no upload do arquivo!");
e.printStackTrace();
}
exemplo de código do lado do servlet
serviço público vazio (requisição HttpServletRequest, resposta HttpServletResponse)
lança ServletException, IOException {
res.setContentType("texto/simples");
InputStream inputStream = null;
tentar {
inputStream = res.getInputStream();
writefile(srcFile, inputStream); //Salva o fluxo de entrada inputStream no arquivo com o caminho do arquivo srcFile
} catch (IOException e) {
e.printStackTrace();
}
} // fim
do resumo do serviço: Na transmissão de arquivos, ele existe na forma de um fluxo, e no disco rígido, existe na forma de um arquivo. Tudo o que precisamos fazer é enviar o fluxo e lê-lo por meio de HttpServletRequest e HttpServletResponse, ou resposta e solicitação. Bem como operações que convertem arquivos em streams ou streams em arquivos.