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
}
}

Springboot上传图片并访问的更多相关文章

  1. 六、SpringBoot与数据访问

    六.SpringBoot与数据访问 1.JDBC spring: datasource: username: root password: 123456 url: jdbc:mysql://192.1 ...

  2. (转)SpringBoot非官方教程 | 第三篇:SpringBoot用JdbcTemplates访问Mysql

    本文介绍springboot通过jdbc访问关系型MySQL,通过spring的JdbcTemplate去访问. 准备工作 jdk 1.8 maven 3.0 idea mysql 初始化mysql: ...

  3. SpringBoot非官方教程 | 第三篇:SpringBoot用JdbcTemplates访问Mysql

    转载请标明出处: 原文首发于https://www.fangzhipeng.com/springboot/2017/07/11/springboot3-JdbcTemplates-Mysql/ 本文出 ...

  4. 第三篇:SpringBoot用JdbcTemplates访问Mysql

    本文介绍springboot通过jdbc访问关系型mysql,通过spring的JdbcTemplate去访问. 准备工作 jdk 1.8 maven 3.0 idea mysql 初始化mysql: ...

  5. https://segmentfault.com/a/1190000012844836---------关于SpringBoot上传图片的几种方式

    关于SpringBoot上传图片的几种方式 https://segmentfault.com/a/1190000012844836

  6. springboot 静态资源访问,和文件上传 ,以及路径问题

    springboot 静态资源访问: 这是springboot 默认的静态资源访问路径  访问顺序依次从前到后(http://localhost:8080/bb.jpg) spring.resourc ...

  7. SpringBoot之数据访问和事务-专题三

    SpringBoot之数据访问和事务-专题三 四.数据访问 4.1.springboot整合使用JdbcTemplate 4.1.1 pom文件引入 <parent> <groupI ...

  8. 解决springboot项目打成jar包部署到linux服务器后上传图片无法访问的问题

    前言:目前大三,自己也在学习和摸索的阶段.在和学校的同学一起做前后端分离项目的时候,我们发现将后端打包成jar,然后部署到服务器中通过java -jar xxx.jar运行项目以后,项目中存在文件上传 ...

  9. java框架之SpringBoot(9)-数据访问及整合MyBatis

    简介 对于数据访问层,无论是 SQL 还是 NOSQL,SpringBoot 默认采用整合 SpringData 的方式进行统一处理,添加了大量的自动配置,引入了各种 Template.Reposit ...

随机推荐

  1. [数组] Leetcode 189.旋转数组

  2. Statements、PreparedStatement及CallableStatement(三)

    当获得了与数据库的连接后,就可以与数据库进行交互了.JDBC Statement,CallableStatement和PreparedStatement接口定义了可用于发送SQL或PL/SQL命令,并 ...

  3. 设计模式-Bridge(结构型模式)-用于客户需求较多,频繁对类进行添加修改的情形,将抽象类与具体实现类分开

    以下代码来源: 设计模式精解-GoF 23种设计模式解析附C++实现源码 //AbstractionImp.h #pragma once class AbstractionImp { public: ...

  4. asp.net的原理

    Asp.net的作业流是指什么?很多人都不是很了解,也不知道是用来干什么的有怎样运用,其实能够从简略的基础了解. 作业流(Workflow),便是“事务进程的部分或全体在核算机使用环境下的主动化”(i ...

  5. [题解向] PAM简单习题

    \(1\) LG5496 [模板]回文自动机 对于 \(s\) 的每个位置,请求出以该位置结尾的回文子串个数. \(|s|\leq 1e6\) 然后就是PAM的板子题咋感觉好像没有不是很板的PAM题呢 ...

  6. 《细说PHP》第四版 样章 第23章 自定义PHP接口规范 2

    23.1.3  接口的应用和优势 API是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无须访问源码,或理解内部工作机制的细节.接口应用的一些常见场景如下 ...

  7. 【文本处理命令】之awk命令详解

    一.awk命令简介 awk 是一种很棒的语言,它适合文本处理和报表生成,其语法较为常见,借鉴了某些语言的一些精华,如 C 语言等.在 linux 系统日常处理工作中,发挥很重要的作用,掌握了 awk将 ...

  8. 人生苦短?试试Groovy进行单元测试

    如果您今天正在编程,那么您很可能听说过单元测试或测试驱动的开发过程.我还没有遇到一个既没有听说过又没有听说过单元测试并不重要的程序员.在随意的讨论中,大多数程序员似乎认为单元测试非常重要. 但是,当我 ...

  9. 前端之CSS1

    CSS基本语法和引入方式 CSS介绍 为了让网页元素的样式更加丰富,也为了让网页的内容和样式能拆分开,CSS由此而诞生,CSS是 Cascading Style Sheets 的首字母缩写,意思是层叠 ...

  10. git报错:fatal: bad config line 1 in file C:/Users/JIANGXIAOLIANG/.gitconfig

    在给git设置用户名和邮箱的时候报下面的错误:fatal: bad config line 1 in file C:/Users/JIANGXIAOLIANG/.gitconfig看提示的意思是git ...