Springboot上传图片并访问

Springboot上传图片并访问

步骤

  1. 配置绝对路径,并将这个绝对路径添加到springboot静态资源目录中。

  2. 文件上传使用绝对路径保存。返回web相对路径,前端加上域名和项目路径,生成完整的路径。

注意如果路径不是绝对路径,则transfer方法实现会自动加上默认基础路径。

webappfile:
  #文件上传目录(注意Linux和Windows上的绝对路径不同,不能通用。)
#  uploadPath: E:/image/upload/
  uploadPath: /root/sources${server.servlet.context-path}/image/upload/
spring:
  resources:
    static-locations: classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/, file:${webappfile.uploadPath}
    
server:
  port: 80
  servlet:
    context-path: /mozq

打印日志

webPath=account/img
webFilePath=account/img/Snipaste_2019-06-24_15-46-57.png
filePath=/root/sources/mozq/image/upload/account/img/Snipaste_2019-06-24_15-46-57.png
uploadReal,destFile=/root/sources/mozq/image/upload/account/img/Snipaste_2019-06-24_15-46-57.png
uploadReal,destFile.getParentFile=/root/sources/mozq/image/upload/account/img

Controller

package com.mozq.boot.upload01.demo;

import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.Map;

@RestController
public class UploadController {
    @Autowired
    private FileService fileService;

    @Value("${webappfile.uploadPath}")
    private String uploadPath;

    @RequestMapping("/uploadNew")
    public String uploadNew(@RequestParam("img")MultipartFile imgFile, HttpServletRequest request) throws IOException {
        String webPath = "account/img";
        System.out.println("webPath=" + webPath);
        String webFilePath = PathUtil.appendWebPath(webPath, imgFile.getOriginalFilename());
        System.out.println("webFilePath=" + webFilePath);
        String filePath = PathUtil.appendWebPath(uploadPath, webFilePath);
        System.out.println("filePath=" + filePath);
        Map<String, String> result = fileService.uploadReal(filePath, imgFile);
        result.put("webUrl", webFilePath);
        return JSONObject.toJSONString(result);
    }

}

FileService

public Map<String, String> uploadReal(String fileName, MultipartFile file){
    //处理后缀
    HashMap<String, String> result = new HashMap<>();
    //获取物理路径
    File destFile = new File(fileName);
    System.out.println("uploadReal,destFile=" + destFile.getAbsolutePath());
    System.out.println("uploadReal,destFile.getParentFile=" + destFile.getParentFile().getAbsolutePath());
    //目录不存在
    if(!destFile.getParentFile().exists()){
        destFile.getParentFile().mkdirs();
    }
    //目录存在是文件
    if(destFile.getParentFile().isFile()){
        result.put("flag", "fail");
        result.put("message","父级路径是文件而不是目录");
        return result;
    }
    //文件已经存在
    /*if(destFile.exists()){
            result.put("flag", "fail");
            result.put("message","文件已经存在");
            return result;
        }*/
    try {
        file.transferTo(destFile);
        result.put("flag", "success");
        result.put("message","文件上传成功");
    } catch (IOException e) {
        e.printStackTrace();
        result.put("flag", "fail");
        result.put("message","文件写入本地发生异常");
    }
    return result;
}

PathUtil

package com.mozq.boot.upload01.demo;

import java.io.File;

public class PathUtil {

    public static String appendPathSep(String src, String separator, String... addPaths){
        StringBuilder result = new StringBuilder(src);
        for (int i = 0; i < addPaths.length; i++) {
            String temp = addPaths[i].startsWith(separator)? addPaths[i] : separator + addPaths[i];
            if(result.toString().endsWith(separator)){
                //含头不含尾。
                result.delete(result.length() - separator.length(), result.length());
            }
            result.append(temp);
        }
        return result.toString();
    }

    public static String appendWebPath(String src,String... addPaths){
        return  appendPathSep(src, "/", addPaths);
    }

    public static String appendPath(String src, String... addPaths){
        return  appendPathSep(src, File.separator, addPaths);
    }

    public static boolean startWith(String src, String[] sep){
        for (String s : sep) {
            if(src.startsWith(s)){
                return true;
            }
        }
        return false;
    }



    public static void main(String[] args) {
        System.out.println(PathUtil.startWith("jie",new String[]{"/"}));
        System.out.println(PathUtil.startWith("/jie",new String[]{"\"}));
        System.out.println(PathUtil.startWith("\jie",new String[]{"\","/"}));
//        String s = PathUtil.appendPathSep("acount/", "/","/jie/chagn", "/xie/aaa/");
//        System.out.println(s);
        /*StringBuilder sb = new StringBuilder("mozq/account/img/");
        sb.delete(sb.length() - 2 , sb.length() - 1);
        System.out.println(sb.toString());*/
//        StringBuilder sb = new StringBuilder("mozq/account/img/");
//        sb.delete(-2, -3);//Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -2
        //System.out.println(null + "123");
        //StringBuilder stringBuilder = new StringBuilder(null);
        //Exception in thread "main" java.lang.NullPointerException
    }
}
原文地址:https://www.cnblogs.com/mozq/p/11877434.html