在JSP中下载文件的最简单方法是在网页上创建超链接,例如:href =“” music / abc.mp3“并单击下载。但是,服务器上的目录资源将直接暴露给最终用户,这将给网站带来一些不安全因素。因此,可以使用其他方法来实现下载,可以在以下方法中执行:1、 RequestDispatcher; 2、以文件流输出的形式下载。
1、使用RequestDispatcher方法:
<%
response.setContentType("application/x-download");//设置为下载application/x-download
String filedownload = "/要下载的文件名";//即将下载的文件的相对路径
String filedisplay = "最终要显示给用户的保存文件名";//下载文件时显示的文件保存名称
filenamedisplay = URLEncoder.encode(filedisplay,"UTF-8");
response.addHeader("Content-Disposition","attachment;filename=" + filedisplay);
try
{
RequestDispatcher dis = application.getRequestDispatcher(filedownload);
if(dis!= null)
{
dis.forward(request,response);
}
response.flushBuffer();
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
}
%>
2、使用文件流输出下载
<%@ page import="java.io.OutputStream" %>
<%@ page import="java.io.FileInputStream" %>
<%@ page import="java.net.URLEncoder" %>
<%@ page language="java" contentType="application/x-msdownload" pageEncoding="UTF-8" %>
<%
//关于文件下载时采用文件流输出的方式处理:
String bath = request.getSession().getServletContext().getRealPath("");
response.setContentType("application/x-download");
String fileDownloadName = bath + request.getParameter("fileDownloadName"); // 下载的文件的物理路径+文件名
String fileDisplayName = String.valueOf(System.currentTimeMillis())+fileDownloadName.substring(fileDownloadName.lastIndexOf("."),fileDownloadName.length()); // 给用户提供的下载文件名
fileDisplayName = URLEncoder.encode(fileDisplayName, "UTF-8");
response.addHeader("Content-Disposition", "attachment;filename=" + fileDisplayName);
OutputStream outp = null;
FileInputStream in = null;
try {
outp = response.getOutputStream();
in = new FileInputStream(fileDownloadName);
byte[] b = new byte[1024];
int i = 0;
while ((i = in.read(b)) > 0) {
outp.write(b, 0, i);
}
outp.flush();
} catch (Exception e) {
System.out.println("文件下载失败!");
e.printStackTrace();
} finally {
if (in != null) {
in.close();
in = null;
}
if (outp != null) {
outp.close();
outp = null;
out.clear();
out = pageContext.pushBody();
}
}
%>
对于第二种方法,我认为应该更常用。但是,有几点值得我们注意:
一、使用第二种方法的主要优点是,实际文件的存储路径对客户端是透明的。
此文件可以存在于服务器可以获取的任何位置,但是客户端可能无法直接获取它。例如,文件来自内部网络上的或FTP服务器。换句话说,此方法可以隐藏实际文件的URL地址。
二、为了防止客户端浏览器直接打开目标文件(例如,带有MS Office套件的Windows中的IE浏览器可能会直接打开要在IE浏览器中下载的doc或xls文件),您必须在响应标头中添加强制下载MIME类型:
response.setContentType(“ application / force-download”); //设置为下载应用程序/ force-download
这样,您可以确保当用户单击下载链接时,浏览器将弹出一个提示窗口,询问您是否要下载或直接打开它,并允许您选择要打开的应用程序,除非您进行了设置浏览器的一些默认行为。
或者,如果您希望客户端自己处理各种文件类型,则可以在服务器配置文件中配置MIME类型映射,并通过简单地判断文件扩展名来处理它。例如,在Tomcat中设置MIME响应类型:
如果客户端中文件的响应者类型与期望的不一致,请修改$ TOMCAT_HOME \ conf \ web.xml文件中的以下部分:
zip
应用程序/邮政编码
mht
message / rfc822
……
三、尽量不要在响应标头中设置浏览器缓存时间。
有时,用户单击下载链接后,在弹出窗口中,用户希望直接单击“打开”而不是保存到指定路径。目前,如果我们在响应头中限制浏览器缓存(即始终刷新),则将无法直接在IE浏览器中打开文件。由于不允许使用缓存的限制,浏览器无法将文件保存到临时文件夹(即缓存)。
换句话说,不要在响应头中设置以下设置(注释):
// response.addHeader(“ pragma”,“ NO-cache”);
// response.addHeader(“ Cache-Control”,“ no-cache”);
// response.addDateHeader(“ Expries”,0);
四、文件名是中文或其他Unicode字符时的处理。
有时提供下载的文件名包含中文字符或其他Unicode字符,这将导致浏览器无法正确使用默认文件名保存文件。我们应该记得在响应头中包含文件名字段,并使用ISO8859-1编码(推荐)或UTF-8编码:
response.setHeader(“ Content-disposition”,“ attachment; filename =” + new String(filename.getBytes(“ UTF-8”),“ iso8859-1”))); //使用ISO8859-1编码
response.setHeader(“ Content-disposition”,“ attachment; filename =” + URLEncoder.encode(filename,“ UTF-8”));; //使用UTF-8编码
但是,此方法在不同的浏览器中的执行方式有所不同。例如,在IE和Firefox中,ISO8859-1编码可以正确显示文件名,但是在Opera中,无论使用哪种编码,默认情况下保存的文件名都无法正确显示。
所以最好的方法是尽可能在文件名中使用ascii编码。
五、由于使用流技术进行输入和输出,因此我们必须确保在使用后关闭流技术资源。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shumachanpin/article-368176-1.html
很多轻型航母