前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >controller下载单个文件

controller下载单个文件

原创
作者头像
在下是首席架构师
发布2022-08-18 20:33:28
6880
发布2022-08-18 20:33:28
举报
文章被收录于专栏:从入门到出门从入门到出门
controller里调用下载方法:然后controller下载方法返回值设置为void即可
代码语言:javascript
复制
DownloadFile.download(request, response, "培训班材料合集", new File(folderPathDto.getTodoDownloadZipPath()));
下载方法代码
代码语言:javascript
复制
import org.apache.commons.io.IOUtils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;

/**
 * 下载文件工具类
 *
 * @author xuyt
 * @date 2020/12/31 15:29
 */
public class DownloadFile {

    /**
     * 用户浏览器关键字:IE
     */
    private static final String USER_AGENT_IE = "MSIE";
    /**
     * 后缀名
     */
    private static final String FILE_SUFFIX = ".zip";

    /**
     * 下载单个文件
     *
     * @param request 请求
     * @param response 响应
     * @param attachmentFileName 附件名称
     * @param file file对象
     */
    public static void download(HttpServletRequest request, HttpServletResponse response, String attachmentFileName, File file) {

        FileInputStream fis = null;
        BufferedInputStream bis = null;
        OutputStream os = null;

        String excelFileName = encodeDownloadFileName(request, attachmentFileName + FILE_SUFFIX);
        try {
            if(!file.exists()){
                response.setContentType("text/html; charset=utf-8");
                PrintWriter writer = response.getWriter();
                writer.print("<script language='javascript'>alert('"+"下载的文件不存在!"+"');</script>");
                writer.flush();
                writer.close();
            }else{
                response.setContentType("multipart/form-data");
                response.setHeader("Content-Disposition", "attachment; " +
                        "filename=\"" + excelFileName + "\";target=_blank");
                os = response.getOutputStream();
                fis = new FileInputStream(file);
                bis = new BufferedInputStream(fis);
                byte[] buffer = new byte[bis.available()];
                int i = bis.read(buffer);
                while(i != -1){
                    os.write(buffer, 0, i);
                    i = bis.read(buffer);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            IOUtils.closeQuietly(bis);
            IOUtils.closeQuietly(fis);
            IOUtils.closeQuietly(os);
        }
    }

    /**
     * 根据不同的浏览器设置下载文件名称的编码
     *
     * @param request 请求request
     * @param fileName 文件名称
     * @return 文件名称
     */
    public static String encodeDownloadFileName(HttpServletRequest request, String fileName) {
        String userAgent = request.getHeader("User-Agent");
        if (userAgent.indexOf(USER_AGENT_IE) > 0) {// 用户在用IE
            try {
                return URLEncoder.encode(fileName, "UTF-8");
            } catch (UnsupportedEncodingException ignore) {}
        } else {
            try {
                return new String(fileName.getBytes(StandardCharsets.UTF_8), "ISO-8859-1");
            } catch (UnsupportedEncodingException ignore) {
            }
        }
        return fileName;
    }
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • controller里调用下载方法:然后controller下载方法返回值设置为void即可
  • 下载方法代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档