1.先在maven中添加依赖
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
</dependency>
2.在yml.xml文件中添加配置
aliyun:
access-id: 你的id
access-key: 你的key
bucket: 你的buket
endpoint: 你的endpoint
dir: 设置文件存放文件夹 随便写 上传自动生成
3.写完配置需要一个实体类接受(我是使用的idea中安装的lombok的插件@Data注入,当然可以写get,set方法。)
import jdk.nashorn.internal.objects.annotations.Setter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Bean;
import com.xg.utils.oss.AliyunOssUtils;
import lombok.data;
@Configuration
@Data
public class AliyunOssProperties {
@Value("${aliyun.access-id}")
private String accessId;
@Value("${aliyun.access-key}")
private String accessKey;
@Value("${aliyun.bucket}")
private String bucket;
@Value("${aliyun.endpoint}")
private String endpoint;
@Value("${aliyun.dir}")
private String dir;
}
3.上传工具类接口
import java.io.File;
import org.springframework.web.multipart.MultipartFile;
public interface AliyunOssService {
/** 上传文件*/
public String upLoad(File file,Long uid);
public File upLoadFile(MultipartFile multipartFile);
public void deleteFile(String filePath);
4.上传工具类实现类
package com.xg.api.service.impl;
import com.xg.api.service.AliyunOssService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.xg.api.config.AliyunOssProperties;
import java.io.File;
import java.text.SimpleDateFormat;
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.CannedAccessControlList;
import com.aliyun.oss.model.CreateBucketRequest;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import org.springframework.web.multipart.MultipartFile;
import java.io.FileOutputStream;
@Service
public class AliyunOssServiceImpl implements AliyunOssService {
@Autowired
private AliyunOssProperties aliyunOssProperties;
@Override
public String upLoad(File file,Long uid){
SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd");
// 判断文件
if(file==null){
return null;
}
String fileUrl = "";
OSSClient client=new OSSClient(aliyunOssProperties.getEndpoint(), aliyunOssProperties.getAccessId(), aliyunOssProperties.getAccessKey());
try {
// 判断容器是否存在,不存在就创建
if (!client.doesBucketExist(aliyunOssProperties.getBucket())) {
client.createBucket(aliyunOssProperties.getBucket());
CreateBucketRequest createBucketRequest = new CreateBucketRequest(aliyunOssProperties.getBucket());
createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead);
client.createBucket(createBucketRequest);
}
// 设置文件路径和名称
fileUrl = (uid + file.getName().substring(file.getName().lastIndexOf("."),file.getName().length()));
//为了删除原来的文件
deleteFile(fileUrl);
// 上传文件
PutObjectResult result = client.putObject(new PutObjectRequest(aliyunOssProperties.getBucket(), fileUrl, file));
System.out.println("文件地址:"+fileUrl);
// 设置权限(公开读)
client.setBucketAcl(aliyunOssProperties.getBucket(), CannedAccessControlList.PublicRead);
}catch (OSSException oe){
oe.getMessage();
}catch (ClientException ce){
ce.getErrorMessage();
}finally{
if(client!=null){
client.shutdown();
}
}
return fileUrl;
}
@Override
public File upLoadFile(MultipartFile multipartFile){
File newFile =null;
try {
String filename = multipartFile.getOriginalFilename();
if (multipartFile!=null) {
if (!"".equals(filename.trim())) {
newFile = new File(filename);
FileOutputStream os = new FileOutputStream(newFile);
os.write(multipartFile.getBytes());
os.close();
multipartFile.transferTo(newFile);
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
return newFile;
}
public void deleteFile(String filePath) {
OSSClient ossClient=new OSSClient(aliyunOssProperties.getEndpoint(), aliyunOssProperties.getAccessId(), aliyunOssProperties.getAccessKey());
boolean exist = ossClient.doesObjectExist(aliyunOssProperties.getBucket(), filePath);
ossClient.deleteObject(aliyunOssProperties.getBucket(), filePath);
ossClient.shutdown();
}
}
3.Controller中的调用。StringUtilUrl.getURL()是指上传的固定的路径
@RequestMapping(value = "/new_icon", method = RequestMethod.POST)
public XgResp new_icon(@RequestAttribute("uid")Long uid, @RequestParam("icon") MultipartFile icon) {
if (icon.isEmpty()) {
return XgResp.fail().msg("上传头像数据为空");
}
File savedName = aliyunOssService.upLoadFile(icon);
String uploadUrl = aliyunOssService.upLoad(savedName,uid);
if (uploadUrl!=null) {
String uploadUrlIoc = StringUtilUrl.getURL()+uploadUrl;
UserInfo userInfo = userService.findByUid(uid);
if (userInfo != null) {
userInfo.setIcon(uploadUrlIoc);
userService.save(userInfo);
}
XgRespData respData = new XgRespData();
respData.put("icon", uploadUrl);
return XgResp.success().with(respData.data());
}else {
return XgResp.fail().msg("存储头像数据出错");
}
}
按照以上代码整合自己需求功能,整个文件上传到阿里云的OSS基本上就完成了,不过该文件是先上传服务器,然后再上传OSS对象,所以不般不要采用该方式上传,根据OSS官方的API可以通过流式上传直接使用MultiparFile格式上传,该代码的实现方式如下:。
public String uploadOSSFree(MultipartFile uploadFile, String picturePath) {
// 创建OSSClient实例
OSSClient ossClient = new OSSClient(aliyunOssProperties.getEndpoint(), aliyunOssProperties.getAccessId(), aliyunOssProperties.getAccessKey());
String url=null;
try {
// 上传:picturePath + uploadFile.getOriginalFilename() --> key
ossClient.putObject(aliyunOssProperties.getBucket(), fileUrl, new ByteArrayInputStream(uploadFile.getBytes()));
// 关闭client
ossClient.shutdown();
//设置过期时间 -- 十年
Date expiration = new Date(new Date().getTime() + 3600l * 1000 * 24 * 365 * 10);
//取出文件上传路径
url = ossClient.generatePresignedUrl(aliyunOssProperties.getBucket(), picturePath, expiration).toString();
} catch (OSSException oe) {
oe.getMessage();
}catch(Exception e ){
e.printStackTrace();
}
return url;
}
将上面最上面的Service中的方法改成uploadOSSFree,Controller直接调用uploadOSSFree方法即可。