• Spring Boot 上传文件 获取项目根路径 物理地址 resttemplate上传文件


    springboot部署之后无法获取项目目录的问题:

    之前看到网上有提问在开发一个springboot的项目时,在项目部署的时候遇到一个问题:就是我将项目导出为jar包,然后用java -jar 运行时,项目中文件上传的功能无法正常运行,其中获取到存放文件的目录的绝对路径的值为空,文件无法上传。问题链接

    不清楚此网友具体是怎么实现的,通常我们可以通过如下方案解决:

    //获取跟目录
    File path = new File(ResourceUtils.getURL("classpath:").getPath());
    if(!path.exists()) path = new File("");
    System.out.println("path:"+path.getAbsolutePath());
    
    //如果上传目录为/static/images/upload/,则可以如下获取:
    File upload = new File(path.getAbsolutePath(),"static/images/upload/");
    if(!upload.exists()) upload.mkdirs();
    System.out.println("upload url:"+upload.getAbsolutePath());
    //在开发测试模式时,得到的地址为:{项目跟目录}/target/static/images/upload/
    //在打包成jar正式发布时,得到的地址为:{发布jar包目录}/static/images/upload/

    另外使用以上代码需要注意,因为以jar包发布时,我们存储的路径是与jar包同级的static目录,因此我们需要在jar包目录的application.properties配置文件中设置静态资源路径,如下所示:

    #设置静态资源路径,多个以逗号分隔
    spring.resources.static-locations=classpath:static/,file:static/

    以jar包发布springboot项目时,默认会先使用jar包跟目录下的application.properties来作为项目配置文件。

    具体项目实战:

    resttemplate上传文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    /**
     * 处理文件上传
     */
    @RequestMapping("/remoteupload")
    @ResponseBody
    public String douploadRemote(HttpServletRequest request, @RequestParam("file") MultipartFile multipartFile) {
     
        if (multipartFile.isEmpty()) {
            return "file is empty.";
        }
     
        String originalFilename = multipartFile.getOriginalFilename();
        String newFileName = UUIDHelper.uuid().replace("-", "") + originalFilename.substring(originalFilename.lastIndexOf(".") - 1);
        File file = null;
        try {
            File path = new File(ResourceUtils.getURL("classpath:").getPath());
            File upload = new File(path.getAbsolutePath(), "static/tmpupload/");
            if (!upload.exists()) upload.mkdirs();
            String uploadPath = upload + "\";
            file = new File(uploadPath + newFileName);
            multipartFile.transferTo(file);
     
            // 提交到另一个服务
            FileSystemResource remoteFile = new FileSystemResource(file);
            // package parameter.
            MultiValueMap<String, Object> multiValueMap = new LinkedMultiValueMap<>();
            multiValueMap.add("file", remoteFile);
     
            String remoteaddr = "http://localhost:12345/test/doupload";
            String res = restTemplate.postForObject(remoteaddr, multiValueMap, String.class);
     
            return res;
        } catch (Exception e) {
            return "file upload error.";
        } finally {
            try{
                file.delete();
            } catch (Exception e) {
                // nothing.
            }
            return "ok";
        }
    }

    可以参见resttemplate文件上传:

    springmvc RestTemplate文件上传

  • 相关阅读:
    centos7使用163 yum源
    Package has no installation candidate解决方法
    HTML 5 canvas相关
    git rebase 使用总结
    Redis不是只有get set那么简单
    k8s---pod常用操作
    Navigator.sendBeacon 无阻塞发送统计数据
    如何在页面关闭或跳转时优雅的发送Ajax请求
    mysql的触发器、视图、索引,受益匪浅
    杂集:centos7中利用logrotate工具切割tomcat日志
  • 原文地址:https://www.cnblogs.com/zhangrui153169/p/11730589.html
Copyright © 2020-2023  润新知