目录
一、存储本地
MultipartFile 常见方法:
String getOriginalFilename(); //获取原始文件名
void transferTo(File dest); //将接收的文件转存到磁盘文件中
long getSize(); //获取文件的大小,单位:字节
byte[] getBytes(); //获取文件内容的字节数组
InputStream getInputStream(); //获取接收到的文件内容的输入流
保证每次上传文件时文件名都唯一的(使用UUID获取随机文件名)
@PostMapping("/upload")
public Result upload(String filename, Integer age, MultipartFile image) throws IOException {
log.info("文件上传 :{},{},{} ",filename,age,image);
// 文件的原始名字
String oraginaFilename = image.getOriginalFilename();
// 截取后缀
String extneme = oraginaFilename.substring(oraginaFilename.lastIndexOf("."));
// 名字用uuid
String updateNmae = UUID.randomUUID().toString() + extneme;
// 将文件保存到本地目录存
image.transferTo(new File("D:/XXXX/" + updateNmae));
return Result.success();
}
二、存储到阿里云
引入阿里云OSS上传文件工具类(由官方的示例代码改造而来)
package com.demo.tliaswebmanagement.utils;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.util.UUID;
/**
* 阿里云 OSS 工具类
*/
@Component
public class AliOSSUtils {
@Autowired
private AliOSSProperties aliOSSProperties;
/**
* 实现上传图片到OSS
*/
public String upload(MultipartFile file) throws IOException {
// 获取相关信息
String endpoint = aliOSSProperties.getEndpoint();
String accessKeyId = aliOSSProperties.getAccessKeyId();
String accessKeySecret = aliOSSProperties.getAccessKeySecret();
String bucketName = aliOSSProperties.getBucketName();
// 获取上传的文件的输入流
InputStream inputStream = file.getInputStream();
// 避免文件覆盖
String originalFilename = file.getOriginalFilename();
String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));
//上传文件到 OSS
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
ossClient.putObject(bucketName, fileName, inputStream);
//文件访问路径
String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;
// 关闭ossClient
ossClient.shutdown();
return url;// 把上传到oss的路径返回
}
}
阿里云属性类
package com.demo.tliaswebmanagement.utils;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@Component
@ConfigurationProperties("aliyun.oss")
public class AliOSSProperties {
//区域
private String endpoint;
// 身份id
private String accessKeyId;
// 身份密钥
private String accessKeySecret;
// 存储空间
private String bucketName ;
}
关于以上的这些阿里云相关配置信息,我们是直接写死在java代码中了(硬编码),如果我们在做项目时每涉及到一个第三方技术服务,就将其参数硬编码,那么在Java程序中会存在两个问题:
-
如果这些参数发生变化了,就必须在源程序代码中改动这些参数,然后需要重新进行代码的编译,将Java代码编译成class字节码文件再重新运行程序。(比较繁琐)
-
如果我们开发的是一个真实的企业级项目, Java类可能会有很多,如果将这些参数分散的定义在各个Java类当中,我们要修改一个参数值,我们就需要在众多的Java代码当中来定位到对应的位置,再来修改参数,修改完毕之后再重新编译再运行。(参数配置过于分散,是不方便集中的管理和维护)
controller类
注入文件上传的工具类
@Autowired
private AliOSSUtils aliOSSUtils;
@PostMapping("/upload")
public Result upload(MultipartFile file) throws IOException{
// 通过工具类oss工具类上传文件并获取url
String url = aliOSSUtils.upload(file);
return Result.success(url);
}
调试
三、配置文件信息
application.yml的配置信息
#数据库配置 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/tlias username: root password: 123456 servlet: multipart: max-file-size: 10MB max-request-size: 100MB #mabits配置 mybatis: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl map-underscore-to-camel-case: true #oss存储配置 aliyun: oss: endpoint: https://oss-cn-guangzhou.aliyuncs.com # 阿里云OSS域名 accessKeyId: xxxxxxxxxxxxxxxxx # 用户身份ID accessKeySecret: xxxxxxxxxxxxxxxxxxxx # 用户密钥 bucketName: web-198 # 存储空间的名字