文件上传指的是,将本地的图片、视频、音频上传到服务器,提供给其他用户浏览和下载的过程
前端需求
想要进行文件上传对于web前端来说有三个重要要素
1.
<input type="file" name="image">
提供这样的file文件上传格式
2.method="post"
由于上传文件一般比较大,所以上传格式采用post类型
3.enctype="multipart/form-data"
设置文件编码格式,如果不选这个提交的就是文件名
action="/upload"
表示提交的位置
<form action="/upload" method="post" enctype="multipart/form-data">
姓名: <input type="text" name="username"><br>
年龄: <input type="text" name="age"><br>
头像: <input type="file" name="image"><br>
<input type="submit" value="提交">
</form>
后端代码
- HTML中的name应该要与public Result upload()中的形参名称一一对应,如果没有对应记得进行映射。
- MultipartFile img用于图像对象
package com.ztt.controller;
import com.ztt.pojo.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
@Slf4j
@RestController
public class UploadController {
@PostMapping("/upload")
public Result upload(String username, Integer age, MultipartFile img)
{
log.info("文件上传:{}{}{}",username,age,img);
return Result.success();
}
}
本地存储
服务端接收到上传的文件后,将文件保存到本地的磁盘目录上。
@Slf4j
@RestController
public class UploadController {
@PostMapping("/upload")
public Result upload(String username, Integer age, MultipartFile image) throws Exception
{
log.info("文件上传:{}{}{}",username,age,image);
// 获取文件名称
String originalFilename = image.getOriginalFilename();
// 将文件存储在本地服务器的磁盘目录下
image.transferTo(new File("D:\\images\\"+originalFilename));
return Result.success();
}
}
注意,本地存储的路径一定要事先准备好,否则会保存
java.io.IOException: java.io.FileNotFoundException: D:\images[3].jpg (系统找不到指定的路径。)
测试的话使用POSTMAN就可以,使用post发送,选择File文件发送即可。
在springboot中,文件上传单次允许最大为1MB。如果需要进行大文件上传,需要进行配置。
在resources中的application.properties中进行配置。
# 单个文件上传限制
spring.servlet.multipart.max-file-size=10MB
# 单个请求最大限制
spring.servlet.multipart.max-request-size=100MB
保证文件名唯一性
如果存储在同一路径下,可能导致服务器路径重复或名称重复导致文件被覆盖。为解决这个问题,我们一般采用UUID的方法。
String originalFilename = image.getOriginalFilename();
// 将文件存储在本地服务器的磁盘目录下
// 获取文件扩展名
int index = originalFilename.lastIndexOf(".");
String exname = originalFilename.substring(index);
String newFileName = UUID.randomUUID() + exname;
// 构造文件唯一性(不能重复) 适应 --uuid(通用唯一识别码)
阿里云OSS
java引入依赖
<!--阿里云OSS依赖-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.15.1</version>
</dependency>
java 9 以上的版本还需要引入下面的依赖
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<!-- no more than 2.3.3-->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.3</version>
</dependency>