package com.jilongda.common.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.File; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; 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 AliOssFileUploadController { @Value("${file.cdn:https://nncdn.pharmacylinked.com}") private String FILE_CDN; // @ApiOperation(value = "单文件上传", notes = "单文件上传,rename 默认不重命名") // @PostMapping(value = "strUpload", headers = "content-type=multipart/form-data") // public String strUploads(@RequestParam(value = "file") MultipartFile mf) throws IOException { // if (mf.isEmpty()) { // return "请传入文件!"; // } // String fileName = mf.getOriginalFilename(); // String TimeDir =new SimpleDateFormat("yyyy-MM-dd").format(new Date()); //// String realPath = "D:\\" + TimeDir; // String realPath = "/usr/local/nginx/html/images/" + TimeDir; // File file = new File(realPath); // // 没有目录就创建 // if (!file.exists()) { // file.mkdirs(); // } // File targetFile = new File(realPath, fileName);//目标文件 // //开始从源文件拷贝到目标文件 // //传图片一步到位 // mf.transferTo(targetFile); // //拼接数据 // return "http://eyes.chelota.com/images/" + TimeDir +"/"+ fileName; // } @ApiOperation(value = "服务端上传", notes = "服务端上传") @PostMapping(value = "upload") public ApiResult fileUpload(@RequestParam(value = "file") MultipartFile file) throws IOException { InputStream inputStream = file.getInputStream(); String filename = System.currentTimeMillis() + file.getOriginalFilename(); // Endpoint以杭州为例,其它Region请按实际情况填写。 final String endpoint = AliOss.endpoint; // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。 final String accessKeyId = AliOss.accessKeyId; final String accessKeySecret = AliOss.accessKeySecret; final String bucketName = AliOss.bucketName; // 上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。 String objectName = AliOss.dir + filename; // 创建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); 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> signature() { OSS builder = new OSSClientBuilder().build(AliOss.endpoint, AliOss.accessKeyId, AliOss.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, AliOss.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 respMap = new LinkedHashMap<>(6); respMap.put("accessid", AliOss.accessKeyId); respMap.put("policy", encodedPolicy); respMap.put("signature", postSignature); // 示例为dir respMap.put("dir", AliOss.dir); // 前端为key // respMap.put("key", AliOss.dir); respMap.put("host", AliOss.host); // respMap.put("cdn", AliOss.cdn); respMap.put("expire", String.valueOf(expireEndTime / 1000)); // // 回调 // if (StringUtils.hasLength(AliOss.callbackUrl)) { // JSONObject jasonCallback = new JSONObject(); // jasonCallback.put("callbackUrl", AliOss.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 = AliOss.endpoint; // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。 final String accessKeyId = AliOss.accessKeyId; final String accessKeySecret = AliOss.accessKeySecret; final String bucketName = AliOss.bucketName; // 上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。 String objectName = AliOss.dir + filename; // 创建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); 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 callback) { String filename = "http://".concat(AliOss.bucketName).concat(".").concat(AliOss.endpoint).concat("/").concat(callback.get("filename").toString()); return ApiResult.okmsg(filename); } }