1.添加依赖
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
2.提前创建好存放图片的文文件夹(也可以通过file对象动态创建)
3.为了访问静态资源文件,修改appaction.yml文件
spring:
// 由于static静态资源下的文件是默认不能被访问的
mvc:
static-path-pattern: /static/**
// 配置自己新建的文件夹,前面是默认的,最后一个是新增的
web:
resources:
static-locations: classpath:/static,classpath:/public,classpath:/resources,classpath:/META-INF/resources,classpath:/static/img
4.编写文件处理类
package cn.hlg.utils;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.util.UUID;
/*
*上传图片所用到的工具类
* */
public class UploadImage {
// 定义一个目标路径,就是我们要把图片上传的位置
private static String BASE_PATH = "";
//静态初块创建文件夹 只会执行一次
static{
File file = new File("src/main/resources/static/image");
if (!file.exists()) {
file.mkdirs();
System.out.println("创建目录" + file.getName() + "成功:"+file.getAbsoluteFile());
BASE_PATH = file.getAbsolutePath();
System.out.println();
}else{
System.out.println("创建目录" + file.getName() + "失败,目标目录已经存在");
BASE_PATH = file.getAbsolutePath();
}
}
// 定义访问图片路径
private static final String SERVER_PATH = "http://localhost/static/image/";
public static String upload(MultipartFile file) {
// 获取上传图片的名称
String filename = file.getOriginalFilename();
// 为了保证图片在服务器中名字的唯一性,使用UUID来对filename进行改写
String uuid = UUID.randomUUID().toString().replace("-", "");
// 将生成的uuid和filename惊醒拼接
String newFileName = uuid + '-' + filename;
// 创建一个文件实例对象
File image = new File(BASE_PATH, newFileName);
// 对这个文件进行上传操作
try {
file.transferTo(image);
} catch (IOException e) {
e.printStackTrace();
}
return SERVER_PATH + newFileName;
}
}
5.创建控制层测试
@RestController
@CrossOrigin(origins = "*")
public class ImagController {
@RequestMapping("/image")
public Answer uploadImage(@RequestParam(value = "file") MultipartFile multipartFile, Answer answer) {
// 调用写好的工具类
String imagePath = UploadImage.upload(multipartFile);
if (imagePath==null){
answer.putValidMessageForOk("上传失败");
}else{
answer.putValidMessageForOk(imagePath);
}
return answer;
}
由于默认1MB大小所报的错修改允许上传的文件大小即可
配置application.yml
// 由于默认大小只有1MB,所以需要自己设置
servlet:
multipart:
max-file-size: 2000MB
max-request-size: 25000MB
结果:成功上传
浏览器访问
6.图片能访问了,但是static目录下的index.html访问不了T,上传图片和不能立即显示,需要点一下idea后再回到页面刷新
(是因为配置了:mvc: static-path-pattern: /static/**)
首先修改 appaction.yml里的配置
创建一个类,继承WebMvcConfigurationSupport类,重写addResourceHandlers()方法,给静态资源请求添加映射,将路径中包括/static/的静态资源访问映射到resources/static/目录下
public class AppConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//映射static路径的请求到static目录下
//获取文件的真实路径
String path = System.getProperty("user.dir")+"\\src\\main\\resources\\static\\image\\";
//path为静态资源真实路径
registry.addResourceHandler("/static/image/**") //虚拟路径
.addResourceLocations("file:"+path);
WebMvcConfigurer.super.addResourceHandlers(registry);
}
}
OK,解决问题,对于static下的imagee静态文件例如图片1.jpg可以正常访问,index.html文件也可以正常访问
http://localhost/mainPage
http://localhost/static/image/0062c6906acc42a09b4a811ab0035f56-1.jpg