首先maven项目中pom.xml引入资源文件
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.8.0</version>
</dependency>
application.yml
aliyun:
#地域节点
endpoint: OSS仓库对应的访问节点(举例:oss-cn-shanghai.aliyuncs.com)
#用户accesskey id
accessKeyId: 阿里云的accessKey账号
#用户accesskey secret
accessKeySecret: 阿里云的accessKey密码
#相当于是哪个库
bucketname: OSS仓库
#文件路径
urlPrefix: xxx
# 目标文件夹
fileHost: xxx
创建java文件
Bean
package com.ford.config;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
@Configuration
@Component
@Data
public class OSSConfiguration {
@Value("${aliyun.endpoint}")
private String endpoint;
@Value("${aliyun.accessKeyId}")
private String accessKeyId;
@Value("${aliyun.accessKeySecret}")
private String accessKeySecret;
@Value("${aliyun.bucketname}")
private String bucketName;
}
Controller
package com.ford.controller;
import com.ford.service.OssService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.List;
@RestController
@RequestMapping("/oss")
public class OSSController {
@Autowired
private OssService fileUpLoadService;
/**
* 上传文件
*
* @param file
* @return
*/
@PostMapping(value = "/uploadFiles")
public String uploadFiles(@RequestParam("file") MultipartFile file) {
return fileUpLoadService.upload(file);
}
/**
* 下载文件
*
* @param fileName
*/
@GetMapping(value = "/exportFile")
public void exportFile(@RequestParam("fileName") String fileName, HttpServletResponse response) throws UnsupportedEncodingException {
fileUpLoadService.exportFile(fileName,response);
}
/**
* 删除文件
*
* @param fileName
*/
@GetMapping(value = "/deleteFile")
public void deleteFile(@RequestParam("fileName") String fileName) {
fileUpLoadService.deleteFile(fileName);
}
/**
* 获取 url
*
* @param fileName
*/
@GetMapping(value = "/getSingeNatureUrl")
public String getSingeNatureUrl(@RequestParam("fileName") String fileName) {
return fileUpLoadService.getSingeNatureUrl(fileName);
}
}
Service
package com.ford.service;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.CannedAccessControlList;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.ObjectMetadata;
import com.ford.config.OSSConfiguration;
import lombok.extern.slf4j.Slf4j;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Date;
import java.util.UUID;
@Slf4j
@Service
public class OssService {
@Autowired
private OSSConfiguration ossConfiguration;
/**
* 上传文件到阿里云 OSS 服务器
* 链接:url
*
* @param file
* @return
*/
public String upload(MultipartFile file) {
String fileUrl = "";
try {
// //2、怎么判断文件内容—> 如果我上传的是rm -rf /* 脚本
// BufferedImage image = ImageIO.read(file.getInputStream());
// if (image == null) {
// // throw new GuliException(ResultCodeEnum.FILE_NULL_ERROR);
// return "文件内容不正确";
// } else {
// System.err.println(image.getHeight());
// System.err.println(image.getWidth());
// }
//判断oss实例是否存在:如果不存在则创建,如果存在则获取
OSSClient ossClient = new OSSClient(ossConfiguration.getEndpoint(),
ossConfiguration.getAccessKeyId(), ossConfiguration.getAccessKeySecret());
if (!ossClient.doesBucketExist(ossConfiguration.getBucketName())) {
//创建bucket
ossClient.createBucket(ossConfiguration.getBucketName());
//设置oss实例的访问权限:公共读
ossClient.setBucketAcl(ossConfiguration.getBucketName(), CannedAccessControlList.PublicRead);
}
//获取上传文件流
InputStream inputStream = file.getInputStream();
//构建日期路径:avatar/2019/02/26/文件名
String filePath = new DateTime().toString("yyyy/MM/dd");
//文件名:uuid.扩展名
String original = file.getOriginalFilename();
String fileName = UUID.randomUUID().toString();
String fileType = original.substring(original.lastIndexOf("."));
String newName = fileName + fileType;
fileUrl = filePath + "/" + newName;
// 设置对象
ObjectMetadata objectMetadata = new ObjectMetadata();
// 设置数据流里有多少个字节可以读取
objectMetadata.setContentLength(inputStream.available());
objectMetadata.setCacheControl("no-cache");
objectMetadata.setHeader("Pragma", "no-cache");
objectMetadata.setContentType(file.getContentType());
objectMetadata.setContentDisposition("inline;filename=" + fileName);
//文件上传至阿里云
ossClient.putObject(ossConfiguration.getBucketName(), fileUrl, inputStream, objectMetadata);
// 关闭OSSClient。
ossClient.shutdown();
//获取url地址
String uploadUrl = "http://" + ossConfiguration.getBucketName() + "." + ossConfiguration.getEndpoint() + "/" + fileUrl;
log.info(uploadUrl);
} catch (IOException e) {
// throw new GuliException(ResultCodeEnum.FILE_UPLOAD_ERROR);
}
return fileUrl;
}
/**
* 下载文件
*
* @param fileName
* @param response
*/
public void exportFile(String fileName, HttpServletResponse response) throws UnsupportedEncodingException {
// 文件名以附件的形式下载
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
// 日期目录
// 注意,这里虽然写成这种固定获取日期目录的形式,逻辑上确实存在问题,但是实际上,filePath的日期目录应该是从数据库查询的
// String filePath = new DateTime().toString("yyyy/MM/dd");
//
// String fileKey = filePath + "/" + fileName;
//判断oss实例是否存在:如果不存在则创建,如果存在则获取
OSSClient ossClient = new OSSClient(ossConfiguration.getEndpoint(),
ossConfiguration.getAccessKeyId(), ossConfiguration.getAccessKeySecret());
if (!ossClient.doesBucketExist(ossConfiguration.getBucketName())) {
//创建bucket
ossClient.createBucket(ossConfiguration.getBucketName());
//设置oss实例的访问权限:公共读
ossClient.setBucketAcl(ossConfiguration.getBucketName(), CannedAccessControlList.PublicRead);
}
// ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。
OSSObject ossObject = ossClient.getObject(ossConfiguration.getBucketName(), fileName);
try {
// 读取文件内容。
InputStream inputStream = ossObject.getObjectContent();
BufferedInputStream in = new BufferedInputStream(inputStream);// 把输入流放入缓存流
ServletOutputStream outputStream = response.getOutputStream();
BufferedOutputStream out = new BufferedOutputStream(outputStream);// 把输出流放入缓存流
byte[] buffer = new byte[1024];
int len = 0;
while ((len = in.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
if (out != null) {
out.flush();
out.close();
}
if (in != null) {
in.close();
}
} catch (Exception e) {
}
}
/**
* 获取 url
*
* @param filename
* @return
*/
public String getSingeNatureUrl(String filename) {
// 过期时间
Date expiration = new Date(System.currentTimeMillis() + 3600l * 24 * 365 * 1000);
//判断oss实例是否存在:如果不存在则创建,如果存在则获取
OSSClient ossClient = new OSSClient(ossConfiguration.getEndpoint(),
ossConfiguration.getAccessKeyId(), ossConfiguration.getAccessKeySecret());
if (!ossClient.doesBucketExist(ossConfiguration.getBucketName())) {
//创建bucket
ossClient.createBucket(ossConfiguration.getBucketName());
//设置oss实例的访问权限:公共读
ossClient.setBucketAcl(ossConfiguration.getBucketName(), CannedAccessControlList.PublicRead);
}
// String filePath = new DateTime().toString("yyyy/MM/dd");
// String fileKey = filePath + "/" + filename;
URL url = ossClient.generatePresignedUrl(ossConfiguration.getBucketName(), filename, expiration);
if (url != null) {
return url.toString();
}
return null;
}
/**
* 删除文件
*
* @param fileName
*/
public void deleteFile(String fileName) {
//判断oss实例是否存在:如果不存在则创建,如果存在则获取
OSSClient ossClient = new OSSClient(ossConfiguration.getEndpoint(),
ossConfiguration.getAccessKeyId(), ossConfiguration.getAccessKeySecret());
if (!ossClient.doesBucketExist(ossConfiguration.getBucketName())) {
//创建bucket
ossClient.createBucket(ossConfiguration.getBucketName());
//设置oss实例的访问权限:公共读
ossClient.setBucketAcl(ossConfiguration.getBucketName(), CannedAccessControlList.PublicRead);
}
String filePath = new DateTime().toString("yyyy/MM/dd");
// String fileKey = filePath + "/" + fileName;
try {
ossClient.deleteObject(ossConfiguration.getBucketName(), fileName);
} catch (Exception e) {
log.error("Error occurred: {}", e.getMessage(), e);
}
}
}