在很多时候我们都需要使用图片上传的功能,比如:自定义头像、物品的图片描述、文章的插图等,那么我们该如何使用Springboot来方便快捷实现图片上传呢?我们闲话少说,直接上代码。
Springboot实现图片上传并返回URL
1. 问题引入
在很多时候我们都需要使用图片上传的功能,比如:自定义头像、物品的图片描述、文章的插图等,那么我们该如何使用Springboot来方便快捷实现图片上传呢?我们闲话少说,直接上代码。
2. 后端代码
1. 创建Maven工程
pom文件依赖
1 | <dependencies> |
2. 编写代码
启动类
1
2
3
4
5
6
public class UploadApplication {
public static void main(String[] args) {
SpringApplication.run(UploadApplication.class);
}
}启动类没啥好说的。
service
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
44
45
public class UploadService {
private static final List<String> CONTENT_TYPES =
Arrays.asList("image/jpeg", "image/gif", "image/png");
/**
* 图片上传:
* 1. 判断文件类型合法性
* 2. 判断文件内容合法性
* 3. 保存文件
* 4. 返回url
*
* @param file
* @return
*/
public String upload(MultipartFile file) {
String originalFilename = file.getOriginalFilename();
// 获取文件content type,判断是否为图片
String contentType = file.getContentType();
if (!CONTENT_TYPES.contains(contentType)) {
// 文件类型不合法
System.out.println("ERROR,文件类型不合法!");
return null;
}
try {
// 读取文件
BufferedImage bufferedImage = ImageIO.read(file.getInputStream());
// 判断文件内容合法性
if (bufferedImage == null) {
System.out.println("ERROR,文件内容不合法!");
return null;
}
// 将文件保存到服务器中
file.transferTo(new File("D:\\test\\" + originalFilename));
// 返回文件连接
return "http://localhost/" + originalFilename;
} catch (IOException e) {
System.out.println("ERROR,服务器内部错误!");
e.printStackTrace();
}
return null;
}
}service层是文件上传逻辑处理的关键,主要流程是:
1. 判断文件名是否合法 2. 判断文件内容是否合法 3. 保存文件【处理文件名】 4. 拼接url并返回
controller
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class UploadController {
private UploadService uploadService;
/**
* 图片上传
*
* @param file
* @return
*/
public Result uploadImage( MultipartFile file){
String url = this.uploadService.upload(file);
if (url == null || url.length() == 0) {
return new Result(false, StatusCode.ERROR, "图片上传异常");
}
return new Result(false, StatusCode.OK, "图片上传成功", url);
}
}这里主要知道使用
MultipartFile
接收上传的文件。这里的Result是自定义的规范,不是本问题的重点。
3. Nginx代理
有了上面的步骤,我们可以实现文件上传到服务器端的磁盘,接下来我们使用Nginx将访问路径代理到我们存储图片的地方。
Nginx配置文件
1 | server { |
上面的配置文件表明了:nginx将所有访问的8888端口代理到了D盘的test目录下。
4. 测试
我们使用Postman,以Post方式,在Body中以form-data中使用file类型进行选择图片提交。可以参考: https://blog.csdn.net/qq_30033537/article/details/105604665
5. 总结
实现图片上传并不麻烦,写这次博客主要是最近使用了图片上传的功能,有点陌生,写下来以后用到看起来也方便。哈哈哈哈哈哈哈!!!没错,被你们看穿了,我就是来水博客的,兑现之前立下的flag。