OSS图片上传
1. 导入依赖
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>2.8.3</version>
</dependency>
2. 添加配置类
package com.sky.xiaoyuan.config;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClient;
import lombok.Data;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@Data //Data的get,set用来注入properties文件
public class OSSConfig {
// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
private String endpoint = "XXX";
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
private String accessKeyId = "XXX";
private String accessKeySecret = "XXX";
// 填写Bucket名称,例如examplebucket。
private String bucketName = "XXX";
//URL前缀
private String urlPrefix = "XXX";
@Bean
public OSS oSSClient(){
return new OSSClient(endpoint,accessKeyId,accessKeySecret);
}
}
endpoint和urlPrefix 的具体位置
accesskey具体位置(个人头像)
使用举例
package com.sky.xiaoyuan.service;
import com.aliyun.oss.OSS;
import com.sky.xiaoyuan.config.OSSConfig;
import com.sky.xiaoyuan.vo.ImageUploadVo;
import org.apache.commons.lang3.RandomUtils;
import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream;
import java.io.IOException;
@Service
public class ImageUploadService {
//自定义允许上传的文件格式
private static final String[] IMAGE_TYPE = new String[]{".bmp", ".jpg", ".jepg", ".gif", ".png"};
//注入阿里云的OSS
@Autowired
private OSS ossClient;
//注入自定义配置类
@Autowired
private OSSConfig ossConfig;
/**
* @param multipartFile 文件对象
* @return
*/
public ImageUploadVo upload(MultipartFile multipartFile) {
//ImageUploadVo是 用来返回的数据类型,根据前端的需求来定义
ImageUploadVo fileUploadResult = new ImageUploadVo();
//先校验图片格式是否符合
boolean isLegal = false;
//遍历所有的自定义数组,判断其是否在自定义的格式中
for (String type : IMAGE_TYPE) {
if (StringUtils.endsWithIgnoreCase(multipartFile.getOriginalFilename(), type)) {
isLegal = true;
break;
}
}
//如果该文件不在规范的格式中,就返回error
if (!isLegal) {
fileUploadResult.setStatus("error");
return fileUploadResult;
}
//获取文件名
String fileName = multipartFile.getOriginalFilename();
//设置文件的存储路径,自定义的方法,来对路径进行命名
String filePath = getFilePath(fileName);
//上传到阿里云
try {
//三个参数分别为OSS的哪一个Bucket,上传到OSS中的路径,上传到OSS的文件的流式
ossClient.putObject(ossConfig.getBucketName(), filePath, new ByteArrayInputStream(multipartFile.getBytes()));
} catch (IOException e) {
e.printStackTrace();
fileUploadResult.setStatus("error");
return fileUploadResult;
}
//封装返回给前端的数据
fileUploadResult.setStatus("done");
fileUploadResult.setName(this.ossConfig.getUrlPrefix() + filePath);
fileUploadResult.setUid(String.valueOf(System.currentTimeMillis()));
return fileUploadResult;
}
/**
* 设置文件的路径,images/时间/...
*
* @param fileName
* @return
*/
private String getFilePath(String fileName) {
DateTime dateTime = new DateTime();
return "images/" + dateTime.toString("yyyy") + "/" + dateTime.toString("MM") + "/" + dateTime.toString("dd") + "/" + System.currentTimeMillis() + RandomUtils.nextInt(100, 9999) + "." + StringUtils.substringAfterLast(fileName, ".");
}
}
本地图片上传
使用举例
package com.sky.xiaoyuan.service;
import com.sky.xiaoyuan.vo.ImageUploadVo;
import org.apache.commons.lang3.RandomUtils;
import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.util.Date;
@Service
public class ImageUploadLocalService {
//自定义允许上传的文件格式
private static final String[] IMAGE_TYPE = new String[]{".bmp", ".jpg", ".jepg", ".gif", ".png"};
public ImageUploadVo uploadVo(MultipartFile multipartFile) {
//ImageUploadVo是 用来返回的数据类型,根据前端的需求来定义
ImageUploadVo fileUploadResult = new ImageUploadVo();
//先校验图片格式是否符合
boolean isLegal = false;
//遍历所有的自定义数组,判断其是否在自定义的格式中
for (String type : IMAGE_TYPE) {
if (StringUtils.endsWithIgnoreCase(multipartFile.getOriginalFilename(), type)) {
isLegal = true;
break;
}
}
//如果该文件不在规范的格式中,就返回error
if (!isLegal) {
fileUploadResult.setStatus("error");
return fileUploadResult;
}
//获取文件名
String fileName = multipartFile.getOriginalFilename();
//设置文件的存储路径,自定义的方法,来对路径进行命名
String filePath = getFilePath(fileName);
// 生成图片的绝对引用地址
String picUrl = StringUtils.replace(StringUtils.substringAfter(filePath, "E:\\java\\project\\tenement\\"), "\\", "/");
//封装返回到前端的链接。部署到nginx后可以通过该链接访问图片
fileUploadResult.setName("http://image.xiaoyuan.com" + picUrl);
File newFile = new File(filePath);
// 写文件到磁盘
try {
multipartFile.transferTo(newFile);
} catch (IOException e) {
e.printStackTrace();
//上传失败
fileUploadResult.setStatus("error");
return fileUploadResult;
}
//封装返回前端的数据
fileUploadResult.setStatus("done");
fileUploadResult.setUid(String.valueOf(System.currentTimeMillis()));
return fileUploadResult;
}
/**
* 设置文件的路径,images/时间/...
*
* @param fileName
* @return
*/
private String getFilePath(String fileName) {
String baseFolder = "E:\\java\\project\\tenement\\" + File.separator + "image";
Date nowDate = new Date();
//路径为时间的格式
String fileFolder = baseFolder + File.separator + new DateTime(nowDate).toString("yyyy")
+ File.separator + new DateTime(nowDate).toString("MM") + File.separator +
new DateTime(nowDate).toString("dd");
File file = new File(fileFolder);
//如果路径不存在就创建该路径
if (!file.isDirectory()) {
file.mkdirs();
}
//生成新的文件名
String newFileName = new DateTime(nowDate).toString("yyyyMMddhhmmssSSSS") + RandomUtils.nextInt(100, 9999) + "."
+ StringUtils.substringAfterLast(fileName, ".");
return fileFolder + File.separator + newFileName;
}
}