zoukankan      html  css  js  c++  java
  • SpringBoot上传文件到本服务器 目录与jar包同级问题

    目录

     

    前言

    看标题好像很简单的样子,但是针对使用jar包发布SpringBoot项目就不一样了。
    当你使用tomcat发布项目的时候,上传文件存放会变得非常简单,因为你可以随意操作项目路径下的资源。但是当你使用SpringBoot的jar包发布项目的时候,你会发现,你不能像以前一样操作文件了。当你使用File file = new File()的时候根本不知道这个路径怎么办。而且总不能很小的项目也给它构建一个文件服务器吧。所以这次就来解决这样的问题。
    不想知道细节的,可以直接跳转到最后封装的部分,里面有相应的实现。

     

    原因

    其实原因你也想的到,你无法对jar包里面的资源进行操作,而对于springboot项目来说,你只能读取里面的文件,只能使用InputStream。使用如下方式针对资源文件进行读取:

    1
    2
    ClassPathResource classPathResource = new ClassPathResource("static/a.txt");
    classPathResource.getInputStream();

    其中,这个a.txt存放在resources/static目录下

    通过上述方式可以获取a中的内容

     

    实现

    因为我们无法操作jar包内容,所以我们只能将文件存放在别的位置,与jar包同级的目录是一个不错的选择。

    首先获取根目录

    1
    2
    3
    4
    File path = new File(ResourceUtils.getURL("classpath:").getPath());
    if(!path.exists()) {
    path = new File("");
    }

    然后获取需要的目录,我们设定我们需要将文件存放在与jar包同级的static的upload目录下

    1
    2
    3
    4
    File upload = new File(path.getAbsolutePath(),"static/upload/");
    if(!upload.exists()) {
    upload.mkdirs();
    }

    然后当我们要将上传的文件存储的时候,按照下面的方式去新建文件,然后使用你喜欢的方式进行存储就可以了。

    1
    2
    File upload = new File(path.getAbsolutePath(),"static/upload/test.jpg");
    FileUtils.copyInputStreamToFile(inputStream, uploadFile);
     

    不要忘记

    你需要在application.yml配置中加入以下代码,指定两个静态资源的目录,这样你上传的文件就能被外部访问到了。

    1
    2
    3
    4
    spring:
    # 静态资源路径
    resources:
    static-locations: classpath:static/,file:static/

    这样就能实现上传文件

     

    最后的封装

    工具类:

    https://github.com/LinkinStars/springBootTemplate/blob/master/src/main/java/com/linkinstars/springBootTemplate/util/FileHandleUtil.java

    这个工具类依赖了

    1
    2
    compile group: 'commons-fileupload', name: 'commons-fileupload', version: '1.3.1'
    compile group: 'commons-io', name: 'commons-io', version: '2.4'

    如何你不喜欢完全可以根据自己的喜欢改变

    如何使用:

    1
    2
    3
    4
    5
    6
    7
    8
    /**
    * 测试文件上传
    */
    @RequestMapping("/upload")
    @ResponseBody
    public String upload(MultipartFile file) throws IOException {
    return "文件存放路径为" + FileHandleUtil.upload(file.getInputStream(), "image/", file.getOriginalFilename());
    }

    最后效果


     

    Follow up

    这个工具类只是实现了如何上传文件,入参也只有InputStream,后续如何你需要接入参数File或者加入文件名防重复等等,就由你来完成了。

    总结

    以上所述是小编给大家介绍的SpringBoot上传文件到本服务器 目录与jar包同级问题,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

  • 相关阅读:
    some tips
    ORA00847: MEMORY_TARGET/MEMORY_MAX_TARGET and LOCK_SGA cannot be set together
    Chapter 01Overview of Oracle 9i Database Perfomrmance Tuning
    Chapter 02Diagnostic and Tuning Tools
    变量与常用符号
    Chapter 18Tuning the Operating System
    标准输入输出
    Trace files
    DBADeveloped Tools
    Chapter 03Database Configuration and IO Issues
  • 原文地址:https://www.cnblogs.com/zhuyeshen/p/11435793.html
Copyright © 2011-2022 走看看