Springboot jarパッケージのファイルの取得とファイルのダウンロード機能

5177 ワード

シーン:springbootはjarパッケージとして打って、クラスの中でjarパッケージの中/static/***を取得します。pdfファイル


ローカルテストは問題なく、パスは全く問題ありませんが、サーバの起動パスには感嘆符が付いています.理由が分かりません.知っている仲間がいれば、一言残してもいいですよ.
感嘆符の問題かと思ったら、replaceが落ちても始まらない.
// /applications/xxx.jar!/BOOT-INF/classes!/ -- -- 
File path = new File(ResourceUtils.getURL("classpath:").getPath());
File file = new File(path + "/static/" + fileName + ".pdf");
fis = new FileInputStream(file);
response.setHeader("Content-Disposition", "attachment; filename=" + file.getName());
IOUtils.copy(fis, response.getOutputStream());
response.flushBuffer();

次の方法に変更すればOKです.fileを取得する必要はありません.inputstreamを取得すればいいです.
@RequestMapping(value = "/download/{fileName}")
    public void downloadFile(@PathVariable String fileName, HttpServletRequest request, HttpServletResponse response) {

        response.setCharacterEncoding(request.getCharacterEncoding());
        response.setContentType("application/octet-stream");
        FileInputStream fis = null;
        try {
            ClassPathResource classPathResource = new ClassPathResource("static/" + fileName + ".pdf");
            InputStream inputStream = classPathResource.getInputStream();
            try {
                IOUtils.copy(inputStream, response.getOutputStream());
                response.flushBuffer();

            } finally {
                IOUtils.closeQuietly(inputStream);
            }
            /*File path = new File(ResourceUtils.getURL("classpath:").getPath());
            File file = new File(path + "/static/" + fileName + ".pdf");
            fis = new FileInputStream(file);
            response.setHeader("Content-Disposition", "attachment; filename=" + file.getName());
            IOUtils.copy(fis, response.getOutputStream());
            response.flushBuffer();*/
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

この方式は私达のプロジェクトの中で使うことができなくて、ただ别のプロジェクトを见て记录を使って、最も良いデータファイルとjarパッケージは别で、ファイルの経路をjarの****に配置します.propertiesでは、ファイルを読み取る方法がより良いです.
次のコードは、固定テンプレートのダウンロードにのみ適用されます.
1、テンプレートパスをjarパッケージ以外のフォルダの下に配置する
2、プロファイルの読み込み
3、中国語のファイル名のダウンロードをサポートできる
@Value("${urldate.importModel}")
    private String importModel;

    /**
     *  
     *
     * @return
     */
    @RequestMapping(value = "/downImportModelFile", produces = "application/json")
    @ResponseBody
    public Result downImportModelFile(HttpServletRequest request, HttpServletResponse response) {
        Result result = downFile(importModel, request, response);
        return result;
    }
/**
     *  
     *       
     * @param filePath  
     * @return
     */
    public Result downFile(String filePath, HttpServletRequest request, HttpServletResponse response) {
        InputStream fis = null;
        OutputStream toClient = null;
        File file = new File(filePath);
        if(!file.exists()){
            return Result.error("file exists");
        }
        try {
            //  。
            fis = new BufferedInputStream(new FileInputStream(filePath));
            byte[] buffer = new byte[fis.available()];
            fis.read(buffer);
            //  Response
            setResponse(request,response,file);
            toClient = new BufferedOutputStream(response.getOutputStream());
            toClient.write(buffer);
            return null;
        } catch (Exception e) {
            e.printStackTrace();
            return Result.error();
        } finally {
            try {
                if (null != fis) {
                    IOUtils.closeQuietly(fis);
                }
                if (null != toClient) {
                    toClient.flush();
                    IOUtils.closeQuietly(toClient);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
 /**
     *  response
     * @param request
     * @param response
     * @param file
     */
    public void setResponse(HttpServletRequest request,HttpServletResponse response,File file) {
        ServletContext sc = request.getSession().getServletContext();
        String fileName = file.getName();
        String filePath = file.getPath();
        //  response
        response.reset();
        //  response Header
//        response.setHeader("Content-Disposition",
//                "attachment;filename="+ new String(fileName.getBytes(),"ISO8859-1"));
        response.setHeader("Content-Disposition","attachment;filename*=UTF-8''"+ URLEncoder.encode(fileName));
        response.addHeader("Content-Length", "" + file.length());
        response.setContentType(sc.getMimeType(filePath));
    }