目录
1.阿里云官方demo
2.这个是OssUtil(本地可以直接测通)
3.oss回调异常总结
4. 优化版本(不可直接使用)
注意: 想直接使用 请使用 2 中代码
-> 4.1 修复图片 在网页上只能下载不能预览问题
-> 4.2 修改动态配置, 跟随dev test master 环境获取配置
-> 4.3 上代码
-> 4.4 另外一种思路
官网地址: ->上传回调 - SDK示例| 阿里云
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.*;
import java.io.ByteArrayInputStream;
public class Demo {
public static void main(String[] args) {
// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
String accessKeyId = "yourAccessKeyId";
String accessKeySecret = "yourAccessKeySecret";
// 填写Bucket名称,例如examplebucket。
String bucketName = "examplebucket";
// 填写Object完整路径,例如exampledir/exampleobject.txt。Object完整路径中不能包含Bucket名称。
String objectName = "exampledir/exampleobject.txt";
// 您的回调服务器地址,例如https://example.com:23450或者https://127.0.0.1:9090。
String callbackUrl = "yourCallbackServerUrl";
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
try {
String content = "Hello OSS";
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName,new ByteArrayInputStream(content.getBytes()));
// 上传回调参数。
Callback callback = new Callback();
callback.setCallbackUrl(callbackUrl);
//(可选)设置回调请求消息头中Host的值,即您的服务器配置Host的值。
// callback.setCallbackHost("yourCallbackHost");
// 设置发起回调时请求body的值。
callback.setCallbackBody("{\\\"mimeType\\\":${mimeType},\\\"size\\\":${size}}");
// 设置发起回调请求的Content-Type。
callback.setCalbackBodyType(Callback.CalbackBodyType.JSON);
// 设置发起回调请求的自定义参数,由Key和Value组成,Key必须以x:开始。
callback.addCallbackVar("x:var1", "value1");
callback.addCallbackVar("x:var2", "value2");
putObjectRequest.setCallback(callback);
PutObjectResult putObjectResult = ossClient.putObject(putObjectRequest);
// 读取上传回调返回的消息内容。
byte[] buffer = new byte[1024];
putObjectResult.getResponse().getContent().read(buffer);
// 数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。
putObjectResult.getResponse().getContent().close();
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (Throwable ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
[官网上有的位置没说 只能自己写]
完整代码跳转: -> oss存储调用,从上传到回调(完整版)
里面的内容填自己的变量与官网上一致
之后想封装就封装, demo能跑通在封装
看下面的注意事项------------>
package sso.service.upload.impl;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.Callback;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import lombok.extern.slf4j.Slf4j;
import sso.util.FileIOUtils;
import sso.vo.SystemResult;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import static sso.vo.ErrorCode.OSS_UPLOAD_CODE;
/**
* @Author pzy
* @Version 0.1.0
*/
@Slf4j
public class OSSUtils {
// public static String UPLOAD_OSS_URL="*";
/**
* uploadOssUrl 上传文件的本地路径(寻找)
* objectName : 上传oss的文件名
*
* @param uploadOssUrl
*/
public static SystemResult OSSUpload(String uploadName, String uploadOssUrl) {
//获取年月日 +时分秒 文章中记录 如果再使用封装
String[] strNow1 = new SimpleDateFormat("yyyy-MM-dd").format(new Date()).toString().split("-");
int i = Integer.parseInt(strNow1[0]);//获取年
int i1 = Integer.parseInt(strNow1[1]);//获取月
int i2 = Integer.parseInt(strNow1[2]);//获取日
//System.out.printf("%s\\%s\\%s\n", i, i1, i2);
//公司的oss
String endpoint = "*";
String accessKeyId = "";
String accessKeySecret = "";
String bucketName = "";
// img/2022/3/8/AD/
String objectName = "img" + "/" + i + "/" + i1 + "/" + i2 + "/AD" + "/" + uploadName;
// 创建OSSClient实例。
com.aliyun.oss.OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
String realUrl = uploadOssUrl + "\\" + uploadName;
// 上传文件流。
InputStream inputStream = null;
try {
//inputStream = new FileInputStream("D:\\software\\workspaceAll\\test\\testdemo\\src\\main\\resources\\static\\pzy\\01.mp4");
inputStream = new FileInputStream(realUrl);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream);
// 上传回调参数。
Callback callback = new Callback();
//回调路径
callback.setCallbackUrl("******");
// 设置发起回调时请求body的值。
callback.setCallbackBody("bucket:${bucket}&object=${object}");
// 设置发起回调请求的Content-Type。
callback.setCalbackBodyType(Callback.CalbackBodyType.URL);
putObjectRequest.setCallback(callback);
PutObjectResult putObjectResult = ossClient.putObject(putObjectRequest);
// 读取上传回调返回的消息内容。
// byte[] buffer = new byte[1024];
// putObjectResult.getResponse().getContent().read(buffer);
// // 数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。
// putObjectResult.getResponse().getContent().close();
//成功后会返回图片的url
String ossUploadBackUrl = putObjectResult.getResponse().getUri();
// System.out.println(ossUploadBackUrl);
log.info("=====>{}", ossUploadBackUrl);
boolean flag = false;
//将路径存储数据库
if (ossUploadBackUrl != null) {
log.debug("oss存储成功!!!");
// 关闭OSSClient。
ossClient.shutdown();
flag = FileIOUtils.fileGCDelete(realUrl);
return SystemResult.ok("oss存储成功!!!,本地文件删除状态---->" + flag).putData(ossUploadBackUrl);
} else {
log.error("oss存储失败!!!");
// 关闭OSSClient。
ossClient.shutdown();
flag = FileIOUtils.fileGCDelete(realUrl);
return SystemResult.error(OSS_UPLOAD_CODE, "文件上传Oss失败,本地文件删除状态---->" + flag);
}
}
}
注意: 报红的部分 常量或util包直接删除即可(那些是为其他业务服务或者error状态码)
回调出现错误可以看看: https://blog.csdn.net/pingzhuyan/article/details/124213798
注意: 想直接使用 请使用 2 中代码
ps: 部分位置飘红, 请忽略 仅仅是路径名, 随意添加, 其他不多介绍
package com.aisce.axmall.third.utils;
import com.aisce.axmall.third.vo.ResultResponse;
import com.aisce.common.constant.AuthServerConstant;
import com.aisce.common.vo.MemberResponseVo;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.Callback;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import lombok.extern.apachecommons.CommonsLog;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* oss上传工具包
*
* oss V3.0.0版本 启动
* 历史版本:
* 1. 搭建oss
* 2. 根据代码环境切换回调函数
* 3. 优化服务器内存使用问题
* 4. 修复部分bug
*
* 新版划分
* 一级:
* 本地dev
* 测试test
* 正式master
*
*
* @author pzy
*/
@Slf4j
@Component
public class OSSUtils {
//accessKey
@Value("${spring.cloud.alicloud.access-key}")
public String accessKeyIdConst;
//秘钥
@Value("${spring.cloud.alicloud.secret-key}")
public String accessKeySecretConst;
//endPoint
@Value("${spring.cloud.alicloud.oss.endpoint}")
public String endpointConst;
//bucket名
@Value("${spring.cloud.alicloud.oss.bucket}")
public String bucketNameConst;
//回调函数路径
@Value("${spring.alibaba.oss.callBack.ipUrl}")
public String ossCallBackIpUrlConst;
/*V3.0版本 优化 新加 跟随环境位置生成不同的文件夹*/
@Value("${spring.profiles.active}")
public String environment;
/**
* 与上面变量一一对应
*/
public static String accessKeyId;
public static String accessKeySecret;
public static String endpoint;
public static String bucketName;
public static String ossCallBackIpUrl;
public static String ossEnvironment;
@PostConstruct//初始化
public void init() {
/* 赋值操作 */
accessKeyId = accessKeyIdConst;
accessKeySecret = accessKeySecretConst;
endpoint = endpointConst;
bucketName = bucketNameConst;
ossCallBackIpUrl = ossCallBackIpUrlConst;
ossEnvironment = environment;
}
// public static String UPLOAD_OSS_URL="*";
/**
* uploadOssUrl 上传文件的本地路径(寻找)
* objectName : 上传oss的文件名
*
* @param uploadOssUrl
*/
public static ResultResponse OSSUpload(String uploadName, String uploadOssUrl) {
//V3.0.1版 废弃----------------------------------------------->
//获取年月日 +时分秒 文章中记录 如果再使用封装
// String[] strNow1 = new SimpleDateFormat("yyyy-MM-dd").format(new Date()).toString().split("-");
// int i = Integer.parseInt(strNow1[0]);//获取年
// int i1 = Integer.parseInt(strNow1[1]);//获取月
// int i2 = Integer.parseInt(strNow1[2]);//获取日
//System.out.printf("%s\\%s\\%s\n", i, i1, i2);
// img/2022/3/8/AD/ oss上传路径整合修改
// String objectName = "img" + "/" + i + "/" + i1 + "/" + i2 + "/pzyStorekeeperOSS" + "/" + uploadName;
// String objectName = ossEnvironment + "/" + i + "/" + i1 + "/" + i2 + "/pzyStorekeeperOSS" + "/" + uploadName;
//----------------------------------------------------------->
Integer companyId = *;//随便
Integer userRole = *;//随便
String roleName = roleChangeToName(userRole);
/**
* V3.0.1版:
* 路径优化:
* 演示示例一: dev/store/2023/01/***.png
* 演示示例二:
*/
String objectName = String.format("%s/%s/%s/%s", ossEnvironment, roleName, companyId, uploadName);
// 创建OSSClient实例 开启oss。
com.aliyun.oss.OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
String realUrl = uploadOssUrl + "\\" + uploadName;
// 上传文件流。
InputStream inputStream = null;
try {
inputStream = new FileInputStream(realUrl);
} catch (FileNotFoundException e) {
e.printStackTrace();
throw new RuntimeException("路径异常,上传失败");
}
/*V3.0.1 解决阿里云OSS 打开图片地址无法预览,直接下载*/
ObjectMetadata meta = new ObjectMetadata();
meta.setContentType("image/jpg");//指定了图片格式
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream, meta);
// 上传回调参数。
Callback callback = new Callback();
//回调路径
callback.setCallbackUrl(ossCallBackIpUrl);
// 设置发起回调时请求body的值。
callback.setCallbackBody("bucket:${bucket}&object=${object}");
// 设置发起回调请求的Content-Type。
callback.setCalbackBodyType(Callback.CalbackBodyType.URL);
putObjectRequest.setCallback(callback);
PutObjectResult putObjectResult = ossClient.putObject(putObjectRequest);
// 读取上传回调返回的消息内容。
// byte[] buffer = new byte[1024];
// putObjectResult.getResponse().getContent().read(buffer);
// // 数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。
// putObjectResult.getResponse().getContent().close();
//成功后会返回图片的url
String ossUploadBackUrl = putObjectResult.getResponse().getUri();
// System.out.println(ossUploadBackUrl);
log.info("=====>{}", ossUploadBackUrl);
boolean flag = false;
//将路径存储数据库
if (ossUploadBackUrl != null) {
log.debug("oss存储成功!!!");
// 关闭OSSClient。
ossClient.shutdown();
flag = FileIOUtils.fileGCDelete(realUrl);
log.info("返回信息:{}", flag);
return ResultResponse.ok(ossUploadBackUrl);
} else {
log.error("oss存储失败!!!");
// 关闭OSSClient。
ossClient.shutdown();
flag = FileIOUtils.fileGCDelete(realUrl);
return ResultResponse.error("文件上传Oss失败,本地文件删除状态---->" + flag);
}
}
/**
* 角色转化方法
*
* @param userRole
* @return
*/
private static String roleChangeToName(Integer userRole) {
String roleName = "";
switch (userRole) {
case 1://*
roleName = "*";
break;
case 2://*
roleName = "*";
break;
case 3://*
roleName = "*";
break;
case 4://*
roleName = "*";
break;
default://*
roleName = "*";
break;
}
return roleName;
}
}
spring:
application:
name: *
servlet:
multipart:
location: /data/upload #解决长时间不使用异常的bug
#限制视频上传大小20MB
max-file-size: 20MB
max-request-size: 20MB
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
alicloud:
access-key: *
secret-key: *
oss:
endpoint: *
bucket: *
创建@Bean对象 但是容易出现创建失败 显示ossClient关闭现象