下载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());
        }
    }
相关推荐
TangKenny4 分钟前
基于EasyExcel的动态列映射读取方案
java·easyexcel
安冬的码畜日常6 分钟前
【JUnit实战3_19】第十章:用 Maven 3 运行 JUnit 测试(下)
java·测试工具·junit·单元测试·maven·junit5
lemon_sjdk16 分钟前
软件开发模式架构选择
java·架构·软件开发·前后端分离
董广明29 分钟前
单元测试(JUnit、Mockito、PowerMock )
java·经验分享·junit·单元测试
Lisonseekpan30 分钟前
Java Stream 流式编程
java·后端
沐浴露z1 小时前
Kafka Consumer 消费流程详解
java·分布式·kafka
程序员小假1 小时前
运行时有出现过什么异常?
java·后端
凤山老林1 小时前
还在用JDK8?JDK8升级JDK11:一次价值千万的升级指南
java·开发语言·jvm·spring boot·后端·jdk
lang201509281 小时前
Apache Maven 项目的开发指南
java·maven·apache
rengang661 小时前
134-Spring AI Alibaba OceanBase 向量数据库示例
java·人工智能·spring·oceanbase·rag·spring ai·ai应用编程