下载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());
        }
    }
相关推荐
cike_y21 分钟前
JavaWeb-Request应用与Cookie&[特殊字符]️Session
java·开发语言·安全·java安全
hashiqimiya31 分钟前
两个步骤,打包war,tomcat使用war包
java·服务器·前端
大筒木老辈子42 分钟前
C++笔记---并发支持库(atomic)
java·c++·笔记
Cricyta Sevina42 分钟前
Java Collection 集合进阶知识笔记
java·笔记·python·collection集合
BD_Marathon1 小时前
【JavaWeb】Servlet_url-pattern的一些特殊写法问题
java·开发语言·servlet
黄俊懿1 小时前
【深入理解SpringCloud微服务】Seata(AT模式)源码解析——开启全局事务
java·数据库·spring·spring cloud·微服务·架构·架构师
零度@1 小时前
Java中Map的多种用法
java·前端·python
中文很快乐1 小时前
java开发--开发工具全面介绍--新手养成记
java·开发语言·java开发·开发工具介绍·idea开发工具
yaoxin5211231 小时前
268. Java Stream API 入门指南
java·开发语言·python
ss2731 小时前
ConcurrentLinkedQueue实战:电商秒杀系统的队列选型优化
java·开发语言·安全