您的位置:首页 > 编程语言 > Java开发

javaweb jsp页面中实现文件下载

2013-11-15 11:07 309 查看
在jsp中有一个a标签 ,当用户点击a标签的时候下载文件。

我们采用href属性直接指向一个服务器地址,只要链接的文件存在,就会给出弹出保存对话框.

点击a标签 先执行onclick事件,再请求href中指向的地址。

前端jsp:

<a href="#" onclick="javascript:downloadtest('${app.id}')"  id="pluginurl"  style="color: #83AFE2;text-decoration:underline;"></a>

然后在js中:

 function downloadtest(id){
var url = "<%=request.getContextPath()%>/app/download" + "/" + id;
$("#pluginurl").attr("href",url);

}

后台java代码: 我的是springmvc

/**
* 下载文件
* @param id appid
* @param response
*/
@RequestMapping(value="/download/{id}")
public void download(@PathVariable String id, HttpServletResponse response){
String filepath = "";
Result result = appService.getAppById(id);
App app = (App) result.getMap().get("app");
if(app == null){
return;
}
filepath = app.getUrl();

File file = new File(filepath);
InputStream inputStream = null;
OutputStream outputStream = null;
byte[] b= new byte[1024];
int len = 0;
try {
inputStream = new FileInputStream(file);
outputStream = response.getOutputStream();

response.setContentType("application/force-download");
String filename = file.getName();
filename = filename.substring(36, filename.length());
response.addHeader("Content-Disposition","attachment; filename=" + URLEncoder.encode(filename, "UTF-8"));
response.setContentLength( (int) file.length( ) );

while((len = inputStream.read(b)) != -1){
outputStream.write(b, 0, len);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(inputStream != null){
try {
inputStream.close();
inputStream = null;
} catch (IOException e) {
e.printStackTrace();
}
}
if(outputStream != null){
try {
outputStream.close();
outputStream = null;
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

注意:response.addHeader("Content-Disposition","attachment; filename=" + URLEncoder.encode(filename, "UTF-8"));

这句必须将文件名字编码一下,不然对于中文名字可能会出现乱码,或者不显示中文名只有后缀。

代码分析,我项目里面先通过id查找对应的bean对象,然后这个对象里面url保存的是服务器端文件系统中的地址比如:“C://download/test.txt”

因为本项目中文件上传的时候保存在服务器文件系统中的,而数据库中保存服务器文件系统地址就可以了。

最主要的是将文件写到输出流中,而且要设置response.addHeader 和 response.setContentLength属性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: