1.oss依赖:
com.aliyun.oss aliyun-sdk-oss2.8.3
2.获取oss相关连接参数:
连接oss所需参数: endpoint、accessKeyId、accessKeySecret、bucketName
accessKeyId 以及 accessKeySecret;
endpoint;
bucketName;
3.获取上述4个值后 ,编写 ossutils.java
public class OssUtils {
private static final Logger log = LoggerFactory.getLogger(OssUtils.class);
private static String[] fileType = {"bmp","gif","jpeg","jpg","png","html","txt","vsd","pptx","ppt","docx","dox","xml"};
private String endpoint = "oss-cn-beijing.aliyuncs.com";
private String accessKeyId = "LTAI5tHcjPxVWXE38EbtCSEA111";
private String accessKeySecret = "sdfsafdasdfassdfsafasafdafdasfdasfd";
private String bucketName = "yijie1";
private String fieldName = "system";
private OSSClient ossClient;
public String getEndpoint() {
return endpoint;
}
public String getAccessKeyId() {
return accessKeyId;
}
public String getAccessKeySecret() {
return accessKeySecret;
}
public String getBucketName() {
return bucketName;
}
public String getFieldName() {
return fieldName;
}
public void setFieldName(String fieldName) {
this.fieldName = fieldName;
}
public OssUtils(){
ossClient = new OSSClient(endpoint,accessKeyId,accessKeySecret);
}
public OssUtils(String fieldName){
this.fieldName = fieldName;
ossClient = new OSSClient(endpoint,accessKeyId,accessKeySecret);
}
public void initOssClient(){
ossClient = new OSSClient(endpoint,accessKeyId,accessKeySecret);
}
public void destoryOssClient(){
ossClient.shutdown();
}
public String uploadFile2OSS(InputStream is,String fileName){
String res = "";
// 判断bucket是否存在,不存在进行创建
if(!doesBucketExist()){
createBucket();
}
try {
// 创建上传object 的metaData
Objectmetadata metadata = new Objectmetadata();
metadata.setContentLength(is.available());
metadata.setCacheControl("no-cache");
metadata.setHeader("Pragma","no-cache");
metadata.setContentType(getContentType(fileName.substring(fileName.lastIndexOf("."))));
metadata.setContentDisposition("inline:filename="+ fileName);
// 指定上传文件操作时是否覆盖同名object
// 不指定 x-oss-forbid-overwrite 时,默认覆盖同名object
// 指定 x-oss-forbid-overwrite 为 false,覆盖同名object
// 指定 x-oss-forbid-overwrite 为 true,禁止覆盖同名object,如果同名object存在,程序报错
// metadata.setHeader("x-oss-forbid-overwrite","false");
SimpleDateFormat type = new SimpleDateFormat("yyyyMMdd");
String format = type.format(new Date());
// 文件保存在bucket中, system/日期/文件
String objectName = fieldName + "/" + format + "/" + fileName;
// 上传文件
ossClient.putObject(bucketName,objectName,is,metadata);
// url 路径
// res = "http://" + bucketName + "." + endpoint + "/" + objectName;
return objectName;
}catch (IOException e){
log.error(e.getMessage(),e);
}finally {
ossClient.shutdown();
try {
if(is != null){
is.close();
}
}catch (IOException e){
throw new RuntimeException(e);
}
}
return res;
}
public boolean doesBucketExist(){
return ossClient.doesBucketExist(bucketName);
}
public boolean doesFileExist(String objectName){
return ossClient.doesObjectExist(bucketName,objectName);
}
private void createBucket(){
CreateBucketRequest bucketRequest = new CreateBucketRequest(bucketName);
// 设置bucket权限为公共读,默认是私有读写
// bucketRequest.setCannedACL(CannedAccessControlList.PublicReadWrite);
// 设置bucket储存类型为低频类型,默认是标准类型
// bucketRequest.setStorageClass(StorageClass.IA);
ossClient.createBucket(bucketRequest);
}
public void createBucket(String bucketName){
CreateBucketRequest bucketRequest = new CreateBucketRequest(bucketName);
// 设置bucket权限为公共读,默认是私有读写
// bucketRequest.setCannedACL(CannedAccessControlList.PublicReadWrite);
// 设置bucket储存类型为低频类型,默认是标准类型
// bucketRequest.setStorageClass(StorageClass.IA);
ossClient.createBucket(bucketRequest);
}
public static String getContentType(String fileNameExtension){
String res = "";
if(fileType[0].equalsIgnoreCase(fileNameExtension)){
res = "image/" + fileType[0];
}else if(fileType[1].equalsIgnoreCase(fileNameExtension)){
res = "image/" + fileType[1];
}else if(fileType[2].equalsIgnoreCase(fileNameExtension) ||
fileType[3].equalsIgnoreCase(fileNameExtension) ||
fileType[4].equalsIgnoreCase(fileNameExtension) ){
res = "image/jpeg";
}else if(fileType[5].equalsIgnoreCase(fileNameExtension)){
res = "text/" + fileType[5];
}else if(fileType[6].equalsIgnoreCase(fileNameExtension)){
res = "text/plain";
}else if(fileType[7].equalsIgnoreCase(fileNameExtension)){
res = "application/vnd.visio";
}else if(fileType[8].equalsIgnoreCase(fileNameExtension) ||
fileType[9].equalsIgnoreCase(fileNameExtension)){
res = "application/vnd.ms-powerpoint";
}else if(fileType[10].equalsIgnoreCase(fileNameExtension) ||
fileType[11].equalsIgnoreCase(fileNameExtension)){
res = "application/msword";
}else if(fileType[12].equalsIgnoreCase(fileNameExtension)){
res = "text/" + fileType[12];
}
return res;
}
public InputStream getInputStreamFileUrl(String fileName){
OSSObject object = ossClient.getObject(bucketName, fileName);
return object.getObjectContent();
}
public boolean deleteFile(String filename){
if(!doesFileExist(filename)){
log.error("文件不存在,filename={}",filename);
return false;
}
ossClient.deleteObject(bucketName,filename);
return true;
}
}
4.ossutils 编写好后,在controller层掉用 uploadFile2OSS (上传) 、getInputStreamFileUrl (下载)、deleteFile(删除)即可
@RestController
public class OssController {
@GetMapping("/oss/text")
public AjaxResult text(){
OssUtils ossUtils = new OssUtils();
AjaxResult result = new AjaxResult();
result.put("getAccessKeyId",ossUtils.getAccessKeyId());
result.put("getAccessKeySecret",ossUtils.getAccessKeySecret());
result.put("getBucketName",ossUtils.getBucketName());
result.put("getEndpoint",ossUtils.getEndpoint());
return result;
}
// 创建bucket
@PostMapping("/oss/createBucket")
public AjaxResult createBucket(){
OssUtils ossUtils = new OssUtils();
ossUtils.createBucket("ssss12");
return AjaxResult.success("ok");
}
// 文件上传
@PostMapping("/oss/upload")
public AjaxResult upload(MultipartFile file){
OssUtils ossUtils = null;
try {
String filename = file.getResource().getFilename();
// 文件名使用uuid,防止重复
String name = UUID.randomUUID() + filename.substring(filename.lastIndexOf("."));
name = name.replace("-","");
InputStream is = file.getInputStream();
ossUtils = new OssUtils();
String url = ossUtils.uploadFile2OSS(is, name);
if(StringUtils.isEmpty(url)){
throw new RuntimeException("error");
}
AjaxResult result = new AjaxResult();
result.put("fileName",filename);
result.put("ossPath",url);
return AjaxResult.success(result);
}catch (IOException e){
throw new RuntimeException("IO error");
}finally {
if(ossUtils != null){
ossUtils.destoryOssClient();
}
}
}
// 文件下载
@GetMapping("/oss/file/download")
public void download( String fileName, String path, HttpServletResponse response){
OssUtils ossUtils = null;
try {
ossUtils = new OssUtils();
InputStream is = ossUtils.getInputStreamFileUrl(path);
// 配置文件下载
response.setHeader("content-Type","application/octet-stream");
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition","attachment;filename=" + URLEncoder.encode(fileName,"UTF-8"));
ServletOutputStream os = response.getOutputStream();
byte[] b = new byte[1024];
int len;
while ((len = is.read(b)) > 0){
os.write(b,0,len);
}
is.close();
os.close();
}catch (IOException e){
e.printStackTrace();
}finally {
if(ossUtils != null){
ossUtils.destoryOssClient();
}
}
}
@GetMapping("/oss/file/remove")
public AjaxResult remove(String path){
OssUtils ossUtils = new OssUtils();
boolean res = ossUtils.deleteFile(path);
if(res){
return AjaxResult.success();
}else {
return AjaxResult.error();
}
}
}
5.使用postman调用上传接口。返回值如图:
其中:filename : 文件原名 , ossPath:文件在oss中的存放位置。返回值设置为此格式是项目需求,各位可自行设置。
6.浏览器调用下载接口。返回值如图:
path:上传文件接口返回的 osspath;fileName :自定义下载文件的文件名;
7.使用postman调用删除接口。返回值如图:
path:上传文件接口返回的 osspath;
oss 上传、下载、删除文件到此结束!!!!
8. 题外话。在之前公司内网开发时。使用oss上传文件时。在所有参数、代码正确的情况下。还是上传文件失败。一直报错。 发现需要在 ossUitls.java 中新增一段配置 。 setSupportCname(false);
public OssUtils(){
ossClient = new OSSClient(endpoint,accessKeyId,accessKeySecret,new ClientConfiguration().setSupportCname(false));
}
缺少此配置报错。百度后没发现setSupportCname(false)的作用。目前未知。



