1. 文件上传的要求:
①请求方式为post
②请求头Content-Type必须为multipart/form-data
2. MultipartFile
一种可以接收使用多种请求方式来进行上传文件的代表形式。
了解几种MultipartFile的常用方法:
//MultipartFile uploadFile
//获取文件原名
uploadFile.getOriginalFilename()
//获取上传文件的大小
uploadFile.getSize()
//获取对应上传文件的输入流
uploadFile.getInputStream()
3. 具体案例的代码实现
基于阿里云OSS实现:阿里云OSS的SDK十分详细的给出了多种解决方案。
Controller层:
@Api(tags = "上传文件模块")
@RestController
public class UploadController {
@Autowired
private UploadService uploadService;
@ApiOperation("上传头像")
@PostMapping("/upload")
public ResponseResult uploadImg(MultipartFile file){
return uploadService.upload(img);
}
}
Service层:
public interface UploadService {
ResponseResult upload(MultipartFile file);
}
ServiceImpl:
@Service
@Data
@ConfigurationProperties(prefix = "oss")
public class OssUploadService implements UploadService {
private String endpoint;
private String accessKeyId;
private String accessKeySecret;
private String bucketName;
public String upload(MultipartFile file) {
try {
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 上传文件流。
InputStream inputStream = file.getInputStream();
String fileName = file.getOriginalFilename();
//生成随机唯一值,使用uuid,添加到文件名称里面
String uuid = UUID.randomUUID().toString().replaceAll("-","");
fileName = uuid+fileName;
//按照当前日期,创建文件夹,上传到创建文件夹里面
// 2021/02/02/01.jpg
String timeUrl = new DateTime().toString("yyyy/MM/dd");
fileName = timeUrl+"/"+fileName;
//调用方法实现上传
// 1.jpg /a/b/1.jpg
ossClient.putObject(bucketName, fileName, inputStream);
// 关闭OSSClient。
ossClient.shutdown();
//上传之后文件路径
// https://yygh-atguigu.oss-cn-beijing.aliyuncs.com/01.jpg
String url = "https://"+bucketName+"."+endpoint+"/"+fileName;
//返回
return url;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
}