控制层
@RequestMapping("/download")
public void download(HttpServletRequest request, HttpServletResponse response, String filename) throws IOException {
NoticeAttachment attachment;
String id = request.getParameter("id");
String basePath = Constants.getAttachmentPath();// 得到上传文件在服务器上的基路径
attachment =noticeAttachmentService.queryNoticeAttachmentById(id);
String fileNameWithPath = null;
if (null != attachment) {
filename = attachment.getName();
fileNameWithPath = attachment.getPath();
//checkPay.apk为需要下载的文件
//String filename = "checkPay.apk"; //我这里使用的是一个固定的文件,方法可以不用写filename参数
//获取文件的绝对路径名称,apk为根目录下的一个文件夹,这个只能获取根目录文件夹的绝对路径
String path = basePath + fileNameWithPath /*+"\\"+filename*/;
System.out.println(path);
//得到要下载的文件
File file = new File(path);
if (!file.exists()) {
response.setContentType("text/html; charset=UTF-8");//注意text/html,和application/html
response.getWriter().print("<html><body><script type='text/javascript'>alert('您要下载的资源已被删除!');</script></body></html>");
response.getWriter().close();
System.out.println("您要下载的资源已被删除!!");
return;
}
//转码,免得文件名中文乱码
filename = URLEncoder.encode(filename,"UTF-8");
//设置文件下载头
response.addHeader("Content-Disposition", "attachment;filename=" + filename);
//1.设置文件ContentType类型,这样设置,会自动判断下载文件类型
response.setContentType("multipart/form-data");
// 读取要下载的文件,保存到文件输入流
FileInputStream in = new FileInputStream(path);
// 创建输出流
OutputStream out = response.getOutputStream();
// 创建缓冲区
byte buffer[] = new byte[1024]; // 缓冲区的大小设置是个迷 我也没搞明白
int len = 0;
//循环将输入流中的内容读取到缓冲区当中
while((len = in.read(buffer)) > 0){
out.write(buffer, 0, len);
}
//关闭文件输入流
in.close();
// 关闭输出流
out.close();
}
}
service
public interface NoticeAttachmentService {
NoticeAttachment queryNoticeAttachmentById(String id) throws DataAccessException;
List<NoticeAttachment> queryNoticeAttachmentByNoticeId(String id);
}
mapper和serviceimpl自己配,都一样的
xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 设置为接口方法提供sql语句配置 -->
<mapper namespace="com.xxxx.NoticeAttachmentMapper">
<resultMap id="BaseResultMap2" type="com.xxxx.NoticeAttachment">
</resultMap>
<select id="queryNoticeAttachmentById" resultMap="BaseResultMap2">
select * from xxxx a where a.id = #{id}
</select>
<select id="queryNoticeAttachmentByNoticeId" resultMap="BaseResultMap2">
select * from xxxx where NOTICEID = #{id}
</select>
</mapper>
文件实体类
package com.xxxx.model;
import java.io.Serializable;
import java.sql.Timestamp;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* @描述 公告通知信息附件的实体类
*/
public class NoticeAttachment implements Serializable {
private static final long serialVersionUID = -3109212517197515946L;
private String id;// 主键ID
private String name; // 上传文件名
private String path; // 上传文件路径
private String noticeId;// 关联的信息ID
private String uploadFileLength; // 上传文件大小
private Timestamp lrsj;// 入库时间
/*@Id
@Column(name = "ID", unique = true, nullable = false, length = 36)*/
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
/*
@Column(name = "NAME", nullable = true)
*/
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/* @Column(name = "PATH", nullable = true)*/
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
/*
@Column(name = "NOTICEID", nullable = true)
*/
public String getNoticeId() {
return noticeId;
}
public void setNoticeId(String noticeId) {
this.noticeId = noticeId;
}
/*
@Column(name = "UPLOADFILELENGTH", nullable = true)
*/
public String getUploadFileLength() {
return uploadFileLength;
}
public void setUploadFileLength(String uploadFileLength) {
this.uploadFileLength = uploadFileLength;
}
/*
@Column(name = "lrsj", nullable = true)
*/
public Timestamp getLrsj() {
return lrsj;
}
public void setLrsj(Timestamp lrsj) {
this.lrsj = lrsj;
}
}
Constants类
package com.xxxx.utils;
/**
* @描述 常量类,定义本系统中用到的一些常量
*/
public class Constants {
/**
* 返回分页时每页显示的数据条数<br>
*
* @return
* @throws
*/
public static Integer getPageSize() {
// 读取配置文件中的属性
/**
* 分页每页显示的记录大小<br>
*/
int PageSize = Integer.valueOf(SystemParamConfigUtil.getParamValueByParam("AMOUNT_ONE_PAGE"));
return PageSize;
}
/**
* 确定是什么操作系统,并返回相应的后缀<br>
* Windows操作系统返回 WIN<br>
* Linux操作系统返回 LNX<br>
*
* @return
*/
private static String getSystemInfo() {
String osName = System.getProperty("os.name");
if (osName == null) {
System.out.println("判断是Windows系统还是Linux系统时出错,位置在cn.com.trueway.innerMail.util.Constants.java");
return "WIN";
}
if (osName.toLowerCase().indexOf("win") != -1) {
// 如果是window 操作系统
return "WIN";
} else {
// 如果是其他的系统
return "LNX";
}
}
/**
* 得到附件的基路径
*
* @return
* @throws
*/
public static String getAttachmentPath() {
String os = getSystemInfo();
// 读取配置文件中的属性
/**
* 在Winodows系统服务器上储存附件的基路径<br>
* 全部路径为:ATTACACHMENT_PATH + 附件名<br>
*/
String ATTACACHMENT_PATH_WIN = SystemParamConfigUtil.getParamValueByParam("ATTACACHMENT_PATH_WIN");
/**
* 在Linux系统服务器上储存附件的基路径<br>
* 全部路径为:ATTACACHMENT_PATH + 附件名<br>
*/
String ATTACACHMENT_PATH_LNX = SystemParamConfigUtil.getParamValueByParam("ATTACACHMENT_PATH_LNX");
int i = ATTACACHMENT_PATH_WIN.lastIndexOf("/");
// 如果基路径不以"/"结尾,则添加上
if ((i > -1) && (i != ATTACACHMENT_PATH_WIN.length() - 1)) {
ATTACACHMENT_PATH_WIN = ATTACACHMENT_PATH_WIN + "/";
}
if (os.equals("WIN")) {
return ATTACACHMENT_PATH_WIN;
} else if (os.equals("LNX")) {
i = ATTACACHMENT_PATH_LNX.lastIndexOf("/");
// 如果基路径不以"/"结尾,则添加上
if ((i > -1) && (i != ATTACACHMENT_PATH_LNX.length() - 1)) {
ATTACACHMENT_PATH_LNX = ATTACACHMENT_PATH_LNX + "/";
}
return ATTACACHMENT_PATH_LNX;
} else {
return ATTACACHMENT_PATH_WIN;
}
}
/**
* 服务器操作系统的编码
*
* @return
* @throws
*/
public static String getSysEncode() {
String os = getSystemInfo();
/**
* Winodows操作系统的编码 默认为GB2312
*/
String SYS_ENCODE_WIN = SystemParamConfigUtil.getParamValueByParam("SYS_ENCODE_WIN");
/**
* Linux操作系统的编码 默认为UTF-8
*/
String SYS_ENCODE_LNX = SystemParamConfigUtil.getParamValueByParam("SYS_ENCODE_LNX");
if (os.equals("WIN")) {
return SYS_ENCODE_WIN;
} else if (os.equals("LNX")) {
return SYS_ENCODE_LNX;
} else {
return SYS_ENCODE_WIN;
}
}
}
注意:需要修改SystemParamConfigUtil类中的initSmsParam方法对应的配置文件
sys.properties
basepath=D\:/lyjj_upload/
pageSize=10
attachmentPath=D\:/lyjj_upload/attachments/
SYS_ENCODE_WIN = GB2312
SYS_ENCODE_LNX = UTF-8
AMOUNT_ONE_PAGE = 10
MORE_NOTICES_ONE_PAGE = 15
#\u5185\u90e8\u901a\u77e5\u9644\u4ef6\u76f8\u5173\u914d\u7f6e
ATTACACHMENT_PATH_WIN = D\:/lyjj_upload/attachments/
ATTACACHMENT_PATH_LNX = D\:/lyjj_upload/attachments/
#\u7167\u7247\u5730\u5740
ATTACACHMENT_ZPDZ=/lyjj/Picture/
ATTACACHMENT_ZPDZ_BAK=D\:/lyjj_upload/pictrue/
这个文件下载demo适用于ssm和ssh(struts2)的框架,主要的要注意上传文件的路径的配置地址配置在sys.properties如果怕冲突可以新建一个properties配置