package com.jilongda.manage.component;
|
|
|
import com.aliyun.oss.OSS;
|
import com.aliyun.oss.OSSClientBuilder;
|
import com.aliyun.oss.common.utils.BinaryUtil;
|
import com.aliyun.oss.model.MatchMode;
|
import com.aliyun.oss.model.OSSObject;
|
import com.aliyun.oss.model.PolicyConditions;
|
import com.aliyun.oss.model.PutObjectResult;
|
import com.jilongda.common.basic.ApiResult;
|
import com.jilongda.common.utils.WebUtils;
|
import io.swagger.annotations.Api;
|
import io.swagger.annotations.ApiOperation;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.multipart.MultipartFile;
|
|
import javax.servlet.http.HttpServletResponse;
|
import java.io.IOException;
|
import java.io.InputStream;
|
import java.nio.charset.StandardCharsets;
|
import java.util.Date;
|
import java.util.LinkedHashMap;
|
import java.util.Map;
|
|
|
/**
|
* @author feiyunchuan
|
*/
|
@Slf4j
|
@Api(tags = "Ali-OSS文件上传接口")
|
@RestController
|
@RequestMapping("/ali-oss/")
|
public class AliOssManageFileUploadController {
|
|
@ApiOperation(value = "服务端上传", notes = "服务端上传")
|
@PostMapping(value = "upload")
|
public ApiResult<String> fileUpload(@RequestParam(value = "file") MultipartFile file) throws IOException {
|
InputStream inputStream = file.getInputStream();
|
String filename = System.currentTimeMillis() + file.getOriginalFilename();
|
// Endpoint以杭州为例,其它Region请按实际情况填写。
|
final String endpoint = AliOssMange.endpoint;
|
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
|
final String accessKeyId = AliOssMange.accessKeyId;
|
final String accessKeySecret = AliOssMange.accessKeySecret;
|
final String bucketName = AliOssMange.bucketName;
|
// <yourObjectName>上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。
|
String objectName = AliOssMange.dir + filename;
|
log.info(objectName);
|
// 创建OSSClient实例。
|
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
|
// 填写本地文件的完整路径。如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。
|
// InputStream inputStream = new FileInputStream("D:\\localpath\\examplefile.txt");
|
// 依次填写Bucket名称(例如examplebucket)和Object完整路径(例如exampledir/exampleobject.txt)。Object完整路径中不能包含Bucket名称。
|
PutObjectResult putObjectResult = ossClient.putObject(bucketName, objectName, inputStream);
|
log.info("上传结果:{}", putObjectResult);
|
OSSObject ossObject = ossClient.getObject(bucketName, objectName);
|
String uri = ossObject.getResponse().getUri();
|
// 关闭OSSClient。
|
ossClient.shutdown();
|
// uri = uri.replace("http://nn-bucket.oss-cn-shanghai.aliyuncs.com",FILE_CDN);
|
return ApiResult.okmsg(uri);
|
}
|
|
|
@ApiOperation(value = "服务端签名后直传", notes = "服务端签名后直传")
|
@PostMapping("signature")
|
public ApiResult<Map<String, String>> signature() {
|
OSS builder = new OSSClientBuilder().build(AliOssMange.endpoint, AliOssMange.accessKeyId, AliOssMange.accessKeySecret);
|
long expireTime = 30;
|
long expireEndTime = System.currentTimeMillis() + expireTime * 1000;
|
Date expiration = new Date(expireEndTime);
|
PolicyConditions policyConds = new PolicyConditions();
|
policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000);
|
policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, AliOssMange.dir);
|
String postPolicy = builder.generatePostPolicy(expiration, policyConds);
|
byte[] binaryData = postPolicy.getBytes(StandardCharsets.UTF_8);
|
String encodedPolicy = BinaryUtil.toBase64String(binaryData);
|
String postSignature = builder.calculatePostSignature(postPolicy);
|
Map<String, String> respMap = new LinkedHashMap<>(6);
|
respMap.put("accessid", AliOssMange.accessKeyId);
|
respMap.put("policy", encodedPolicy);
|
respMap.put("signature", postSignature);
|
// 示例为dir
|
respMap.put("dir", AliOssMange.dir);
|
// 前端为key
|
// respMap.put("key", AliOssMange.dir);
|
respMap.put("host", AliOssMange.host);
|
// respMap.put("cdn", AliOssMange.cdn);
|
respMap.put("expire", String.valueOf(expireEndTime / 1000));
|
// // 回调
|
// if (StringUtils.hasLength(AliOssMange.callbackUrl)) {
|
// JSONObject jasonCallback = new JSONObject();
|
// jasonCallback.put("callbackUrl", AliOssMange.callbackUrl);
|
// String callbackBody = "{\"filename\":${object},\"size\":${size},\"mimeType\":${mimeType}}";
|
// jasonCallback.put("callbackBody", callbackBody);
|
// jasonCallback.put("callbackBodyType", "application/json");
|
// String base64CallbackBody = BinaryUtil.toBase64String(jasonCallback.toString().getBytes());
|
// respMap.put("callback", base64CallbackBody);
|
// }
|
|
// HttpServletResponse response = WebUtils.response();
|
// assert response != null;
|
// response.setHeader("Access-Control-Allow-Origin", "*");
|
// response.setHeader("Access-Control-Allow-Methods", "GET, POST");
|
|
// 关闭OSSClient。
|
builder.shutdown();
|
return ApiResult.success(respMap);
|
}
|
|
@ApiOperation(value = "服务端上传(二进制字符串)", notes = "服务端上传")
|
@PostMapping(value = "str/upload")
|
public String strUpload(InputStream inputStream, String filename) throws IOException {
|
//String filename = System.currentTimeMillis() + CodeGenerateUtils.generateVolumeSn()+".jpg";
|
// Endpoint以杭州为例,其它Region请按实际情况填写。
|
final String endpoint = AliOssMange.endpoint;
|
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
|
final String accessKeyId = AliOssMange.accessKeyId;
|
final String accessKeySecret = AliOssMange.accessKeySecret;
|
final String bucketName = AliOssMange.bucketName;
|
// <yourObjectName>上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。
|
String objectName = AliOssMange.dir + filename;
|
log.info(objectName);
|
// 创建OSSClient实例。
|
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
|
// 填写本地文件的完整路径。如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。
|
// InputStream inputStream = new FileInputStream("D:\\localpath\\examplefile.txt");
|
// 依次填写Bucket名称(例如examplebucket)和Object完整路径(例如exampledir/exampleobject.txt)。Object完整路径中不能包含Bucket名称。
|
PutObjectResult putObjectResult = ossClient.putObject(bucketName, objectName, inputStream);
|
log.info("上传结果:{}", putObjectResult);
|
OSSObject ossObject = ossClient.getObject(bucketName, objectName);
|
String uri = ossObject.getResponse().getUri();
|
// 关闭OSSClient。
|
ossClient.shutdown();
|
return uri;
|
}
|
|
/**
|
* oss上传成功回调
|
*
|
* @param callback
|
* @return
|
*/
|
@ApiOperation(value = "oss回调", notes = "oss回调")
|
@PostMapping(value = "/callback")
|
public ApiResult callback(@RequestBody Map<String, Object> callback) {
|
log.info("oss回调{}", callback);
|
String filename = "http://".concat(AliOssMange.bucketName).concat(".").concat(AliOssMange.endpoint).concat("/").concat(callback.get("filename").toString());
|
return ApiResult.okmsg(filename);
|
}
|
|
}
|