下载jar中classes下的文件

问题描述

项目之前被下载的文档是存放在构建后的项目包/{basedir}/manual_file路径下。之后因为项目改为轻门户后端,仅使用jar包方式启动,造成原本的下载文档不可用。对下载文档部分进行了调整,对过程进行一下记录。

原方案

package.xml中配置内容

        <fileSet>
            <directory>${basedir}/manual_file</directory>
            <outputDirectory>manual_file</outputDirectory>
            <includes>
                <include>*.docx</include>
            </includes>
            <fileMode>0755</fileMode>
        </fileSet>

下载

    @Override
    public void downloadManual(String projectPath, HttpServletRequest request, HttpServletResponse response) {
        String manualPath = StringUtils.join(new String[]{projectPath, "/manual_file/", "test.docx"});
        DownloadUtils.downloadByFilePath(manualPath, request, response);
    }

下载工具类

package com.changkong.util;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DownloadUtils {

    public static void downloadByFilePath(String path, HttpServletRequest request, HttpServletResponse response) {
        downloadFile(new File(path), request, response);
    }

    public static void downloadFile(File file, HttpServletRequest request, HttpServletResponse response) {
        InputStream fis = null;
        OutputStream outputStream = null;
        try {
            // 取得文件名。
            String filename = file.getName();
            // 取得文件的后缀名。
            String ext = filename.substring(filename.lastIndexOf(".") + 1).toUpperCase();

            // 以流的形式下载文件。
            fis = new BufferedInputStream(new FileInputStream(file));
            byte[] buffer = new byte[fis.available()];
            fis.read(buffer);
            // 清空response
            response.reset();

            String realname = filename;
            String agent = (String)request.getHeader("USER-AGENT");
            if(agent != null && agent.toLowerCase().indexOf("firefox") > 0)//火狐浏览器下采用base64编码
            {
                realname = "=?UTF-8?B?" + (new String(org.apache.commons.codec.binary.Base64.encodeBase64(realname.getBytes("UTF-8")))) + "?=";
            }
            else {
                realname = URLEncoder.encode(realname, "UTF-8");
            }

            // 设置response的Header
            response.addHeader("Content-Disposition", "attachment;filename=" +realname);
            response.addHeader("Content-Length", "" + file.length());
            outputStream = new BufferedOutputStream(response.getOutputStream());
            response.setContentType("application/octet-stream");
            outputStream.write(buffer);
            outputStream.flush();
        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            if (fis != null ) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (outputStream != null) {
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
调整后的方案

test.docx当前位置

/src/main/resources/test.docx

下载

    @Override
    public void downloadManual(HttpServletRequest request, HttpServletResponse response){
        try {
            InputStream inputStream = LocationUtil.class.getResourceAsStream("/test.docx");
            File file = new File("test.docx");
            FileUtils.copyInputStreamToFile(inputStream, file);
            inputStream.close();
            DownloadUtils.downloadFile(file,request,response);
        } catch (Exception e) {
            log.error("文档不存在:{}", e.getMessage());
        }
    }
相关推荐
新手小袁_J7 分钟前
JDK11下载安装和配置超详细过程
java·spring cloud·jdk·maven·mybatis·jdk11
呆呆小雅8 分钟前
C#关键字volatile
java·redis·c#
Monly218 分钟前
Java(若依):修改Tomcat的版本
java·开发语言·tomcat
Ttang2311 分钟前
Tomcat原理(6)——tomcat完整实现
java·tomcat
钱多多_qdd21 分钟前
spring cache源码解析(四)——从@EnableCaching开始来阅读源码
java·spring boot·spring
waicsdn_haha23 分钟前
Java/JDK下载、安装及环境配置超详细教程【Windows10、macOS和Linux图文详解】
java·运维·服务器·开发语言·windows·后端·jdk
Q_192849990634 分钟前
基于Spring Boot的摄影器材租赁回收系统
java·spring boot·后端
Code_流苏36 分钟前
VSCode搭建Java开发环境 2024保姆级安装教程(Java环境搭建+VSCode安装+运行测试+背景图设置)
java·ide·vscode·搭建·java开发环境
禁默1 小时前
深入浅出:AWT的基本组件及其应用
java·开发语言·界面编程
Cachel wood1 小时前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架