jsp中实现文件下载
(一)
最简单的方式是在网页上做超级链接,如:<a href="music/abc.mp3">点击下载</a>。
但是这样服务器上的目录资源会直接暴露给最终用户,会给网站带来一些不 安全的因素。
因此可以采用其它方式实现下载,可以采用:
1、RequestDispatcher的方式进行;
2、采用文件流输出的方式下载。 (推荐)
1、采用RequestDispatcher的方式进行
-
<%
-
response.setContentType("application/x-download");//设置为下载application/x-download
-
String filedownload = "/要下载的文件名";//即将下载的文件的相对路径
-
String filedisplay = "最终要显示给用户的保存文件名";//下载文件时显示的文件保存名称
-
String 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
-
{
-
-
}
-
%>
<%
response.setContentType("application/x-download");//设置为下载application/x-download
String filedownload = "/要下载的文件名";//即将下载的文件的相对路径
String filedisplay = "最终要显示给用户的保存文件名";//下载文件时显示的文件保存名称
String 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 language="java" contentType="application/x-msdownload" pageEncoding="gb2312"%>
-
<%
-
//关于文件下载时采用文件流输出的方式处理:
-
//加上response.reset(),并且所有的%>后面不要换行,包括最后一个;
-
-
response.reset();//可以加也可以不加
-
response.setContentType("application/x-download");
-
-
//application.getRealPath("/main/mvplayer/CapSetup.msi");获取的物理路径
-
-
String filedownload = "想办法找到要提供下载的文件的物理路径+文件名";
-
String filedisplay = "给用户提供的下载文件名";
-
String filedisplay = URLEncoder.encode(filedisplay,"UTF-8");
-
response.addHeader("Content-Disposition","attachment;filename=" + filedisplay);
-
-
java.io.OutputStream outp = null;
-
java.io.FileInputStream in = null;
-
try
-
{
-
outp = response.getOutputStream();
-
in = new FileInputStream(filenamedownload);
-
-
byte[] b = new byte[1024];
-
int i = 0;
-
-
while((i = in.read(b)) > 0)
-
{
-
outp.write(b, 0, i);
-
}
-
//
-
outp.flush();
-
//要加以下两句话,否则会报错
-
//java.lang.IllegalStateException: getOutputStream() has already been called for //this response
-
out.clear();
-
out = pageContext.pushBody();
-
}
-
catch(Exception e)
-
{
-
System.out.println("Error!");
-
e.printStackTrace();
-
}
-
finally
-
{
-
if(in != null)
-
{
-
in.close();
-
in = null;
-
}
-
//这里不能关闭
-
//if(outp != null)
-
//{
-
//outp.close();
-
//outp = null;
-
//}
-
}
-
%>
<%@page language="java" contentType="application/x-msdownload" pageEncoding="gb2312"%>
<%
//关于文件下载时采用文件流输出的方式处理:
//加上response.reset(),并且所有的%>后面不要换行,包括最后一个;
response.reset();//可以加也可以不加
response.setContentType("application/x-download");
//application.getRealPath("/main/mvplayer/CapSetup.msi");获取的物理路径
String filedownload = "想办法找到要提供下载的文件的物理路径+文件名";
String filedisplay = "给用户提供的下载文件名";
String filedisplay = URLEncoder.encode(filedisplay,"UTF-8");
response.addHeader("Content-Disposition","attachment;filename=" + filedisplay);
java.io.OutputStream outp = null;
java.io.FileInputStream in = null;
try
{
outp = response.getOutputStream();
in = new FileInputStream(filenamedownload);
byte[] b = new byte[1024];
int i = 0;
while((i = in.read(b)) > 0)
{
outp.write(b, 0, i);
}
//
outp.flush();
//要加以下两句话,否则会报错
//java.lang.IllegalStateException: getOutputStream() has already been called for //this response
out.clear();
out = pageContext.pushBody();
}
catch(Exception e)
{
System.out.println("Error!");
e.printStackTrace();
}
finally
{
if(in != null)
{
in.close();
in = null;
}
//这里不能关闭
//if(outp != null)
//{
//outp.close();
//outp = null;
//}
}
%>
对于第二种方法,我认为应该是比较常用的。不过有几个地方是值得我们注意的:
一、采用第二种方法的主要优点是实际文件的存放路径对客户端来说是透明的。
这个文件可以存在于任何你的服务器能够取得到的地方,而客户端不一定能直接得到。例如文件来自于数据库或者内部网络的一个FTP服务器。还句话说,这种方式可以实现隐藏实际文件的URL地址。
二、为了防止客户端浏览器直接打开目标文件(例如在装了MS Office套件的Windows中的IE浏览器可能就会直接在IE浏览器中打开你想下载的doc或者xls文件),你必须在响应头里加入强制下载的MIME类型:
response.setContentType("application/force-download");//设置为下载application/force-download
这样,就可以保证在用户点击下载链接的时候浏览器一定会弹出提示窗口来询问你是下载还是直接打开并允许你选择要打开的应用程序,除非你设置了浏览器的一些默认行为。
或者,你想让客户端自行处理各种不同的文件类型,你可以在服务器的配置文件中配置MIME类型映射,通过简单的判断文件后缀名来处理。例如,在Tomcat中设置MIME响应类型:
如果文件在客户端中的响应程序类型和期望不一致,修改$TOMCAT_HOME/conf/web.xml文件中的如下部分 :
<mime-mapping>
<extension>zip</extension>
<mime-type>application/zip</mime-type>
</mime-mapping>
<mime-mapping>
<extension>mht</extension>
<mime-type>message/rfc822</mime-type>
</mime-mapping>
……
三、在响应头中尽量不要设置浏览器缓存期限。
有时候用户在点击了下载链接后,在弹出窗口中,用户想直接点击“打开”,而不想保存到指定路径。这时候如果我们在响应头中限制了不允许使用浏览器缓存(即总是刷新),在IE浏览器中我们将无法直接打开该文件。因为限制了不允许使用缓存,浏览器无法将文件保存到临时文件夹(即缓存)。
也就是说,在响应头中不要进行如下的设置(已注释):
//response.addHeader("pragma","NO-cache");
//response.addHeader("Cache-Control","no-cache");
//response.addDateHeader("Expries",0);
四、文件名为中文或其他unicode字符时的处理。
有时候提供下载的文件名中包含中文字符或者其他unicode字符,会导致浏览器无法正确的采用默认的文件名保存文件。我们应该记住在响应头中包含filename字段并采用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编码。
五、由于采用流的方式进行输入输出,我们必须保证在使用完毕后关闭流的资源。
一般我们把关闭流的操作放在finally块中,以保证在程序段结束前一定会关闭流的资源:
InputStream is = null;
ServletOutputStream sos = null;
try {
is = ...; //通过某种方式读进数据到输入流
sos = response.getOutputStream(); //打开输入流
byte[] buff = new byte[2048];
int bytesRead;
while(-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
sos.write(buff,0,bytesRead);
sos.flush();
}
} catch(IOException ex) {
//TODO something with IOException
} catch(Exception ex) {
//TODO something with Exception
} finally {
if(is != null) {
is.close(); //关闭输入流
}
if(sos != null) {
sos.close(); //关闭输入流
}
}
相关推荐
经过修改的 jspsmart插件,能够很好的支持包含中文名称的上传和下载。但是要注意中文名称中如果包含了空格,需要自己先去出空格,才能保证上传和下载文件正常。
这是一个非常好的JSP项目请大家下载啊,请大家注意了
针对 import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext....注意导入jar包时应注意Servlet的版本,如果是Servlet 2.4 对应的应该是JSP 2.0 的jar包,如果是Servlet 2.5对应的则是JSP 2.1的jar包
使用ecplise打开即可,upload.jsp是上传文件界面,show.jsp中可以下载文件,相关的java代码在src目录下,很简单不多说,可运行。上传的文件可以在tomcat下的wtpwebapps下的files文件夹中看到。(注意:每一次重新部署...
真正解决jspSmartUpload组件上传下载文件时中文乱码问题。以前在网上也找过!!!下载了些,都没能解决中文乱码问题!自己改了源代码,并做成jar包,直接用就可以。 另,我把File()类 改成了 SmartFile()类。详情请...
安装方法 1:MS SQL 把SETSQL.SQL用查询分析器导入你现在所在的库. 2:直接浏览器执行,注意用OPERA.这样的M3GATE或者其他.支持WAP的手机.
2.7 JSP运行时错误处理与应该注意的六个常见问题 37 2.8 JSP小实例 38 2.8.1实例1(在JSP中定义函数) 38 2.8.2实例2(获取各种CGI环境变量) 39 2.8.3实例3(JSP里request变量列表) 42 2. 9本章...
注意这里的要缓存<!DOCTYPE html> <html lang=zh-CN> 第三步: 在body中载入需要的组件: 运行在tomcat服务器上: 效果如图: 第四步:tomcat的8080端口被占用,修改tomcat的文件: 然后重启eclipse...
5. 此为JSP环境集成包,需要php集成包的请到www.phpstudy.net下载phpStudy。 6. apache默认端口80,tomcat默认端口8080,mysql默认端口3306。 7. 默认php程序放在WWW/phproot下可解析;也可在高级设置里分开解析,即...
详细介绍了上传下载的功能,必要代码做了详细说明,这里有不必要的添加数据库操作,因为下载我是从数据库取得文件在服务器的地址,请大家注意区分。
文档中详细介绍了学习JSP的步骤和要注意的问题
jsp 数据连接池 mysql sqlserver 数据库都可以支持 分页 登陆 文件上传 下载 注意运行的时候 请将 Meta-inf下的context.xml文件复制一份到tomcat 的安装目录conf 下
JSP下载文件说明包括两部分内容,一部分是JSP基础知识;另一部分是综合实例。读者可根据相应的使用说明直接使用这些源代码。 一、基础知识部分 此部分是指文件夹名为第1~9章中的内容(如表1),这些是书中介绍JSP...
比如,D:Tomcat 4.0webapps,注意需要连同目录“jspsmartupload”一起拷贝。 5、创建数据源。 使用ODBC数据源管理器,添加系统DSN,驱动程序选择"Miscosoft Access Driver(*.mdb)",数据源名填写"files",并按...
jsp使用连接池方式连接MySQL数据库时需要注意的事项
jsp-file-browser 1.2 截止2022年8月11日最新版本,一个jsp文件可实现系统文件管理上传,下载,查看。鄙视那些骗币的人,下载了自己改改,结果错误一大堆还不能用。 此文件原版正品,非常好用,但要注意仅限于正常...
作用:取得指定位移处的文件对象File(这是com.jspsmart.upload.File,不是java.io.File,注意区分)。 原型:public File getFile(int index)。其中,index为指定位移,其值在0到getCount()-1之间。 3、getSize ...
最后执行附带的数据库(各版本的数据库不能通用~)即可~ <br>注意: 如果提示无法连接数据库,则必须安装SQL2000-KB884525-SP4-x86-CHS 可以从微软网站上下载,具体地址是: ...
学习jsp的同学们注意关注我,我会给大家不停歇的跟新jsp的PPT以及学习视频
其中,需要注意的地方是: “Install As Windows Service”一定要勾选,这是将MySQL作为Windows的服务运行。 “Service Name”使用默认的“MySQL” “Launch the MySQL Server automatically”一定勾选,这样...