OSS文件上传
基于springboot 项目做 :
配置文件中加入:
spring.servlet.multipart.max-file-size=15MB
spring.servlet.multipart.max-request-size=15MB
uposs.allowed-file-size-max=2MB
uposs.allowed-file-suffix=PNG,JPG,JPEG
uposs.aliyun.oss.endpoint=oss-cn-beijing.aliyuncs.com
uposs.aliyun.oss.bucketName=hzx-weishu
uposs.aliyun.oss.accessKeyID=LTAI5t9wkfTMvJuVxUEevHpK
uposs.aliyun.oss.accessKeySecret=n2cSXyT27Qqk0eBETSnSxRJpYLa93O
工具类:
/**
* 文件大小校验工具类
*
* @author awg
* @date 2020/10/27 星期二
*/
public class FileUtil {
/**
* 校验文件大小是否合法 (true-合法, false-不合法)
*
* @param file 需要校验的文件
* @param maxFileSizeStr 单个文件上传的最大值的字符串表示(如10MB)
* @return 校验文件大小的结果 (true-合法, false-不合法)
*/
public static boolean fileSizeJudge(MultipartFile file, String maxFileSizeStr) {
// 先获取配置文件中的设置的单个文件的大小
if (Objects.isNull(file) || !StringUtils.hasLength(maxFileSizeStr)) {
throw new IllegalArgumentException("缺少必要的参数");
}
/*
* 转换
*/
// 文件大小的数值: 如10MB的10, 最终要转换成字节数进行比较
long num = Long.parseLong(maxFileSizeStr.split("[A-Z]{2,4}")[0]);
// 文件大小的单位: 如10MB的MB
String unit = maxFileSizeStr.substring(String.valueOf(num).length()).toUpperCase();
// 文件大小转为字节
switch (unit) {
case "BYTE":
break;
case "KB":
num = num * 1024;
break;
case "MB":
num = num * 1024 * 1024;
break;
case "GB":
num = num * 1024 * 1024 * 1024;
break;
case "TB":
num = num * 1024 * 1024 * 1024 * 1024;
break;
default:
num = 0L;
break;
}
return file.getSize() <= num;
}
/**
* 获取文件的内容类型
*
* @param suffix 文件后缀名(包括.)
* @return 文件的内容类型
*/
public static String getContentType(String suffix) {
// 文件的内容类型,默认为纯文本格式(text/plain)
String contentType;
switch (suffix.toLowerCase()) {
case ".bmp":
contentType = "image/bmp";
break;
case ".gif":
contentType = "image/gif";
break;
case ".png":
case ".jpg":
case ".jpeg":
contentType = "image/jpeg";
break;
case ".html":
contentType = "text/html";
break;
case ".vsd":
contentType = "application/vnd.visio";
break;
case ".ppt":
case ".pptx":
contentType = "application/vnd.ms-powerpoint";
break;
case ".doc":
case ".docx":
contentType = "application/msword";
break;
case ".xml":
contentType = "text/xml";
break;
case ".pdf":
contentType = "application/pdf";
break;
default:
contentType = "text/plain";
break;
}
return contentType;
}
}
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.ObjectMetadata;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Date;
import java.util.Objects;
import java.util.UUID;
/**
* OSS工具类 - 阿里云OSS服务器工具类
*
* @author awg
* @date 2020/10/26
*/
@Component
public class OssUtil {
/*
* 从配置文件获取阿里云OSS的相关配置
*/
/**
* 阿里云OSS的地域节点
*/
@Value("${uposs.aliyun.oss.endpoint}")
private String endpoint;
/**
* 阿里云OSS的存储空间名称
*/
@Value("${uposs.aliyun.oss.bucketName}")
private String bucketName;
/**
* 阿里云OSS的访问秘钥ID
*/
@Value("${uposs.aliyun.oss.accessKeyID}")
private String accessKeyID;
/**
* 阿里云OSS的访问秘钥凭证
*/
@Value("${uposs.aliyun.oss.accessKeySecret}")
private String accessKeySecret;
/**
* 阿里云OSS的存储空间的上传文件的存储目录
*/
// @Value("${uposs.aliyun.oss.uploadSaveDir}")
// private String uploadSaveDir;
/**
* 上传文件
*
* @param file 上传的文件
* @return 上传成功之后文件的URL路径
* @throws IOException IO异常
*/
public String uploadFile(MultipartFile file) throws IOException {
//上传图片到OSS
String fileUrl = uploadImg2OSS(file);
//获取上传图片到OSS之后的URL路径
String str = getURL(fileUrl);
return str.trim();
}
/**
* 上传图片到OSS
*
* @param file 上传的文件
* @return 上传文件的新的名称
* @throws IOException IO异常
*/
@SuppressWarnings("deprecation")
private String uploadImg2OSS(MultipartFile file) throws IOException {
// 1.生成新的文件名称(以防止文件名称重复)
String fileName = file.getOriginalFilename();
String suffix = Objects.requireNonNull(fileName).substring(fileName.lastIndexOf(".")).toLowerCase();
String uuid = UUID.randomUUID().toString().replace("-", "");
String lastName = uuid + suffix;
// 2.上传文件到OSS
InputStream inputStream = file.getInputStream();
// 2.1创建上传的Object的metadata
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentLength(inputStream.available());
objectMetadata.setCacheControl("no-cache");
objectMetadata.setHeader("Pragma", "no-cache");
objectMetadata.setContentType("image/jpg");
objectMetadata.setContentType(FileUtil.getContentType(lastName.substring(lastName.lastIndexOf("."))));
objectMetadata.setContentDisposition("inline;filename=" + lastName);
// 2.2上传文件
OSSClient ossClient = new OSSClient(endpoint, accessKeyID, accessKeySecret);
ossClient.putObject(bucketName, lastName, inputStream, objectMetadata);
inputStream.close();
return lastName;
}
/**
* 获得URL链接
*
* @param lastName 上传文件的新的名称
* @return 文件上传成功之后文件的URL路径
*/
@SuppressWarnings("deprecation")
private String getURL(String lastName) {
// 设置URL的过期时间为20年, 即: 20*365*24*60*60*1000L 毫秒
Date expiration = new Date(new Date().getTime() + 20*365*24*60*60*1000L);
// 生成URL
OSSClient ossClient = new OSSClient(endpoint, accessKeyID, accessKeySecret);
URL url = ossClient.generatePresignedUrl(bucketName, lastName, expiration);
// 去除URL的参数
String tmp = url.toString().split("\\?")[0];
int index = tmp.lastIndexOf("/") + 1;
return tmp.substring(0, index) + tmp.substring(index);
}
}
controller层
@RestController
@RequestMapping("/ossUpload")
public class OssUploadController {
@Autowired
OssUtil ossUtil;
@RequestMapping("/upload")
public String upload(MultipartFile file) throws IOException {
String fileUrl = ossUtil.uploadFile(file);
return fileUrl;
}
}