阿里云文档:参考文献
更正第三点:用户带着从服务器获取的数据签名和文件上传到OSS,这样做可以保证安全性、减轻服务器负担。
1、操作步骤
①新建Bucket
②创建后更改跨域设置
这一步是保证跨域请胯下所有post请求都能访问
③创建AccessKey
2、配置代码
①参数讲解
String accessId = ""; // 请填写您的AccessKeyId。 String accessKey = " "; // 请填写您的AccessKeySecret。 String endpoint = "oss-cn-hangzhou.aliyuncs.com"; // 请填写您的 endpoint。 String bucket = "bucket-name"; // 请填写您的 bucketname 。 String host = "https://" + bucket + "." + endpoint; // host的格式为 bucketname.endpoint // callbackUrl为上传回调服务器的URL,请将下面的IP和Port配置为您自己的真实信息。 String callbackUrl = "http://88.88.88.88:8888"; String dir = "user-dir-prefix/"; // 用户上传文件时指定的前缀。
②官方代码样例
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String accessId = ""; // 请填写您的AccessKeyId。 String accessKey = " "; // 请填写您的AccessKeySecret。 String endpoint = "oss-cn-hangzhou.aliyuncs.com"; // 请填写您的 endpoint。 String bucket = "bucket-name"; // 请填写您的 bucketname 。 String host = "https://" + bucket + "." + endpoint; // host的格式为 bucketname.endpoint // callbackUrl为 上传回调服务器的URL,请将下面的IP和Port配置为您自己的真实信息。 String callbackUrl = "http://88.88.88.88:8888"; String dir = "user-dir-prefix/"; // 用户上传文件时指定的前缀。 // 创建OSSClient实例。 OSS ossClient = new OSSClientBuilder().build(endpoint, accessId, accessKey); try { long expireTime = 30; long expireEndTime = System.currentTimeMillis() + expireTime * 1000; Date expiration = new Date(expireEndTime); // PostObject请求最大可支持的文件大小为5 GB,即CONTENT_LENGTH_RANGE为5*1024*1024*1024。 PolicyConditions policyConds = new PolicyConditions(); policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000); policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, dir); String postPolicy = ossClient.generatePostPolicy(expiration, policyConds); byte[] binaryData = postPolicy.getBytes("utf-8"); String encodedPolicy = BinaryUtil.toBase64String(binaryData); String postSignature = ossClient.calculatePostSignature(postPolicy); Map respMap = new LinkedHashMap (); respMap.put("accessid", accessId); respMap.put("policy", encodedPolicy); respMap.put("signature", postSignature); respMap.put("dir", dir); respMap.put("host", host); respMap.put("expire", String.valueOf(expireEndTime / 1000)); // respMap.put("expire", formatISO8601Date(expiration)); JSONObject jasonCallback = new JSONObject(); jasonCallback.put("callbackUrl", callbackUrl); jasonCallback.put("callbackBody", "filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}"); jasonCallback.put("callbackBodyType", "application/x-www-form-urlencoded"); String base64CallbackBody = BinaryUtil.toBase64String(jasonCallback.toString().getBytes()); respMap.put("callback", base64CallbackBody); JSONObject ja1 = JSONObject.fromObject(respMap); // System.out.println(ja1.toString()); response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "GET, POST"); response(request, response, ja1.toString()); } catch (Exception e) { // Assert.fail(e.getMessage()); System.out.println(e.getMessage()); } finally { ossClient.shutdown(); } }
③测试代码
import com.aliyun.oss.OSSClient; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import javax.annotation.Resource; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; @SpringBootTest class GulimallThirdPartyApplicationTests { @Resource OSSClient ossClient; @Test public void testUplod() throws FileNotFoundException { // Endpoint以杭州为例,其它Region请按实际情况填写。 String endpoint = "oss-cn-shenzhen.xxxx.com"; // 云账号AccessKey有所有API访问权限,建议遵循阿里云安全最佳实践,创建并使用RAM子账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建。 String accessKeyId = "xxxxxx"; // 请填写您的AccessKeySecret。 String accessKeySecret = "xxxxxxx";// 请填写您的AccessKeySecret // 创建OSSClient实例。 OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); // 上传文件流。 InputStream inputStream = new FileInputStream("D:\\imgs\\a22.jpg");
// 上传的Bucket 名称和在Bucket中上传图片的新名称。 ossClient.putObject("gulimall-lin", "house.jpg", inputStream); // 关闭OSSClient。 ossClient.shutdown(); System.out.println("上传成功"); } @Test void contextLoads() { } }
运行发现文件上传成功,存在图片名称:
3、实际代码使用
①application.yml创建
spring:
cloud:
alicloud:
access-key: xxxxx //请填写您的AccessKeySecret
secret-key: xxxxx // 请填写您的AccessKeySecret
oss:
endpoint: oss-cn-shenzhen.xxxx.com // 请填写您的EndPoint(地域节点)
bucket: gulimall-lin // 上传的Bucket 名称
application:
name: gulimall-third-party
server:
port: 30000
②应用服务器源码包含了签名直传服务
package com.atguigu.gulimall.thirdparty.controller; import com.aliyun.oss.OSS; import com.aliyun.oss.common.utils.BinaryUtil; import com.aliyun.oss.model.MatchMode; import com.aliyun.oss.model.PolicyConditions; import com.atguigu.common.utils.R; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.text.SimpleDateFormat; import java.util.Date; import java.util.LinkedHashMap; import java.util.Map; @RestController public class OssController { @Resource OSS ossClient; @Value("${spring.cloud.alicloud.oss.endpoint}") private String endpoint; @Value("${spring.cloud.alicloud.oss.bucket}") private String bucket; @Value("${spring.cloud.alicloud.access-key}") private String accessId; @RequestMapping("/oss/policy") public R policy() { //host拼装方式:ttps://gulimall-lin.oss-cn-shenzhen.aliyuncs.com/house.jpg // String bucket = "gulimall-lin"; // 请填写您的 bucketname 。 String host = "https://" + bucket + "." + endpoint; // host的格式为 bucketname.endpoint // callbackUrl为 上传回调服务器的URL,请将下面的IP和Port配置为您自己的真实信息。 //String callbackUrl = "http://88.88.88.88:8888"; String format = new SimpleDateFormat("yyyy-MM-dd").format(new Date());//以日期的方式创建文件夹放置当日上传的文件 String dir = format+"/"; // 用户上传文件时指定的前缀。 MaprespMap = null; // 创建OSSClient实例。 try { long expireTime = 30; long expireEndTime = System.currentTimeMillis() + expireTime * 1000; Date expiration = new Date(expireEndTime); // PostObject请求最大可支持的文件大小为5 GB,即CONTENT_LENGTH_RANGE为5*1024*1024*1024。 PolicyConditions policyConds = new PolicyConditions(); policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000); policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, dir); String postPolicy = ossClient.generatePostPolicy(expiration, policyConds); byte[] binaryData = postPolicy.getBytes("utf-8"); String encodedPolicy = BinaryUtil.toBase64String(binaryData); String postSignature = ossClient.calculatePostSignature(postPolicy); respMap = new LinkedHashMap (); respMap.put("accessid", accessId); respMap.put("policy", encodedPolicy); respMap.put("signature", postSignature); respMap.put("dir", dir); respMap.put("host", host); respMap.put("expire", String.valueOf(expireEndTime / 1000)); // respMap.put("expire", formatISO8601Date(expiration)); } catch (Exception e) { // Assert.fail(e.getMessage()); System.out.println(e.getMessage()); } finally { ossClient.shutdown(); } return R.ok().put("data",respMap); } }