oss进阶

oss是对象存储系统。

1.获取临时授权访问oss的token

package cn.hls.xjx.util.ossUtil;

import cn.hls.xjx.constant.Constant;
import cn.hls.xjx.util.IDUtil;
import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.aliyuncs.sts.model.v20150401.AssumeRoleRequest;
import com.aliyuncs.sts.model.v20150401.AssumeRoleResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

/**
 *@Description STS临时授权访问OSS
 *@ClassName OssSecurityTokenUtil
 *@Author hasee
 *@Date 2020/2/11 14:45
 *@Version 1.0
 */
public class OssSecurityTokenUtil {
    public static Map<String,Object> getToken() {
        Map<String,Object> result = new HashMap<>();
        String id= IDUtil.getUUID().substring(0,16);
        id=id.replace(id.substring(0,1),"ossId");
        Map<String, String> tokenMessage = getSTSToken(id);
        if (tokenMessage.size() == 0) {
            result.put("status", 0);
            result.put("desc", "请求失败!");
            return result;
        }
        result.put("Expiration", tokenMessage.get("Expiration"));
        result.put("AccessKey", tokenMessage.get("AccessKey"));
        result.put("AccessKeySecret", tokenMessage.get("AccessKeySecret"));
        result.put("SecurityToken", tokenMessage.get("SecurityToken"));
        result.put("endpoint", OssProFileConstant.endpoint);
        result.put("bucket", OssProFileConstant.bucket);
        result.put("status", 1);
        result.put("desc", "请求成功!");
        return result;
    }

    public static JSONObject getServerCode(HttpServletRequest request) {
        JSONObject result = new JSONObject();
        result.put("serverCode", Constant.serverCode);
        return result;
    }

    public static Map<String, String> getSTSToken(String userId) {
        Map<String, String> tokenMessage = new HashMap<String, String>();
        try {
            // 添加endpoint(直接使用STS endpoint,前两个参数留空,无需添加region ID)
            DefaultProfile.addEndpoint("", "", "Sts", OssProFileConstant.endpoint);
            // 构造default profile(参数留空,无需添加region ID)
            IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", OssProFileConstant.accessKeyId, OssProFileConstant.accessKeySecret);
            // 用profile构造client
            DefaultAcsClient client = new DefaultAcsClient(profile);
            final AssumeRoleRequest request = new AssumeRoleRequest();
            request.setMethod(MethodType.POST);
            request.setRoleArn(OssProFileConstant.roleArn);
            //使用当前的用户id作为session名称
            request.setRoleSessionName(userId);
            request.setPolicy(OssProFileConstant.policy); // Optional
            request.setDurationSeconds(900L);
            final AssumeRoleResponse response = client.getAcsResponse(request);
            tokenMessage.put("Expiration", response.getCredentials().getExpiration());
            tokenMessage.put("AccessKey", response.getCredentials().getAccessKeyId());
            tokenMessage.put("AccessKeySecret", response.getCredentials().getAccessKeySecret());
            tokenMessage.put("SecurityToken", response.getCredentials().getSecurityToken());
            tokenMessage.put("RequestId", response.getRequestId());
        } catch (ClientException e) {
        }
        return tokenMessage;
    }
}

2.通过临时授权上传文件

package cn.hls.xjx.util.ossUtil;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Map;
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.Callback;
import com.aliyun.oss.model.Callback.CalbackBodyType;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
/**
 * OSS上传工具
 * @author hmy
 */
public class OssUploadUtils {
    /**
     * 简单上传
     * @param type:1表示字符串,2表示本地文件(绝对路径),3表示网络文件地址,4表示文件流,5表示字节数组
     * @param objectName:表示上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg   不包含buket
     * @param content:字符串
     * @param url:文件地址
     * @param inputStream:文件流
     * @param bytes:字节数组
     */
    public static Boolean uploadOSS(Integer type,String objectName,String content,String url,InputStream inputStream,byte[] bytes){
        Map<String, Object> map = OssSecurityTokenUtil.getToken();
        // 创建OSSClient实例    试用sts授权生成临时的key和secret
        OSS ossClient = new OSSClientBuilder().build(OssProFileConstant.endpoint, map.get("AccessKey").toString(), map.get("AccessKeySecret").toString(), map.get("SecurityToken").toString());
        PutObjectRequest putObjectRequest = null;
        try {
            switch (type) {
                case 1:
                    // 上传字符串
                    putObjectRequest = new PutObjectRequest(OssProFileConstant.bucket, objectName,new ByteArrayInputStream(content.getBytes()));
                    ossClient.putObject(putObjectRequest);
                    break;
                case 2:
                    // 上传文件
                    putObjectRequest = new PutObjectRequest(OssProFileConstant.bucket, objectName, new File(url));
                    ossClient.putObject(putObjectRequest);
                    break;
                case 3:
                    // 上传网络流。
                    InputStream is = new URL(url).openStream();
                    ossClient.putObject(OssProFileConstant.bucket, objectName, is);
                    break;
                case 4:
                    // 上传文件流。
                    PutObjectResult putObjectResult = ossClient.putObject(OssProFileConstant.bucket, objectName, inputStream);
                    break;
                case 5:
                    // 上传Byte数组
                    putObjectRequest = new PutObjectRequest(OssProFileConstant.bucket, objectName,new ByteArrayInputStream(bytes));
                    ossClient.putObject(putObjectRequest);
                    break;
                default:
                    // 上传文件流。
                    ossClient.putObject(OssProFileConstant.bucket, objectName, inputStream);
                    break;
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 关闭OSSClient。
            ossClient.shutdown();
        }
        return true;
    }

    /**
     * 上传回调
     * @return
     */
    public static String callbackOSS(String descFileUrlName,Map<String, Object> map) throws IOException {
        String callbackUrl = "http://172.18.1.71:12080";
        // 创建OSSClient实例    试用sts授权生成临时的key和secret
        OSS ossClient = new OSSClientBuilder().build(OssProFileConstant.endpoint, map.get("AccessKey").toString(), map.get("AccessKeySecret").toString(), map.get("SecurityToken").toString());
        try {
            String content = "Hello OSS";
            PutObjectRequest putObjectRequest = new PutObjectRequest(OssProFileConstant.bucket, descFileUrlName,new ByteArrayInputStream(content.getBytes()));
            Callback callback = new Callback();
            callback.setCallbackUrl(callbackUrl);
//            callback.setCallbackHost("oss-cn-hangzhou.aliyuncs.com");
            callback.setCallbackBody("{\\\"bucket\\\":${bucket},\\\"object\\\":${object},"
                    + "\\\"mimeType\\\":${mimeType},\\\"size\\\":${size}" );
            callback.setCalbackBodyType(CalbackBodyType.JSON);
//            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 (ClientException 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 {
            ossClient.shutdown();
        }
        return "OK";
    }
}

3.url访问oss中的文件

    

    示例:当  桶名为:shipinziyuan-1    分布地域是 beijing  则如下访问

     https://shipinziyuan-1.oss-cn-beijing.aliyuncs.com/shipinceshi/3.jpg

4.oss配置域名访问(一般是二级域名)

      

     如绑定域名: up.xinjiaoxue.cn   点击提交后等待几分钟就可以如下访问:  

     https://up.xinjiaoxue.cn/shipinceshi/3.jpg

    ***实际上 up.xinjiaoxue.cn  替换了   shipinziyuan-1.oss-cn-beijing.aliyuncs.com

5.删除的接口

    

    /**
    *description:
    *@author: fuxb
    *@date: 2020/10/29 14:39
    * @param objectName
    *@return: java.lang.Boolean
    */
    public static Boolean deleteObject(String objectName) {
        Map<String, Object> map = OssSecurityTokenUtil.getToken();
        // 创建OSSClient实例    试用sts授权生成临时的key和secret
        OSS ossClient = new OSSClientBuilder().build(OssProFileConstant.endpoint, map.get("AccessKey").toString(), map.get("AccessKeySecret").toString(), map.get("SecurityToken").toString());
        // 删除文件。如需删除文件夹,请将ObjectName设置为对应的文件夹名称。如果文件夹非空,则需要将文件夹下的所有object删除后才能删除该文件夹。
        ossClient.deleteObject(OssProFileConstant.bucket, objectName);
        // 关闭OSSClient。
        ossClient.shutdown();
        return true;
    }

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值