文件下载

控制层

@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配置

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值