腾讯云cos上传及获取

需求背景:在开发过程中遇到过需要用户上传文件及下载文件的需求,可文件上传到服务器又会对服务器造成越来越大的压力,这时就考虑把文件放到云上。(这里的云不是天上的云哈~~~

前期准备:开通腾讯云账号并购买cos。

                  需准备:cosAPPID,secretID,secretKey,cosBucket(腾讯云内创建)

获取BUCKET代码

/**
     * 获取bucket
     * @param unionId
     * @param hospitalId
     * @return
     */
    private String getBucket (String unionId,String hospitalId){
        //这个我是在数据库里配置的,也可以在配置文件内配置,通个账号也可以写死。
        String cosAppid = xxx.getConfigValue(unionId, hospitalId,
                HospitalConfigTypeEnumeration.COS_APPID).getValueData();
        String cosBucket =xxx.getConfigValue(unionId, hospitalId,
                HospitalConfigTypeEnumeration.COS_BUCKET).getValueData();
        return cosBucket+"-"+cosAppid;
    }

获取cos服务

  /**
     * 获取cos服务
     * @param unionId
     * @param hospitalId
     * @return
     */
    private COSClient getCOSClient(String unionId,String hospitalId){
        //获取cosSecretID 可以写死,也可以配置,按自己需求
        String cosSecretId =xxx.getConfigValue(unionId, hospitalId,
                HospitalConfigTypeEnumeration.COS_SECRETID).getValueData();
        String cosSecretKey = xxx.getConfigValue(unionId, hospitalId,
                HospitalConfigTypeEnumeration.COS_SECRETKEY).getValueData();
        COSCredentials cred = new BasicCOSCredentials(cosSecretId, cosSecretKey);
        //cos 服务器
        Region region = new Region("ap-shanghai");
        ClientConfig clientConfig = new ClientConfig(region);
        // 生成 cos 客户端。
        COSClient cosClient = new COSClient(cred, clientConfig);
        return cosClient;
    }

验证文件类型是否符合要求(工具)

/**
     * 验证文件类型是否符合要求
     *
     * @param ext
     * @return
     * @Description
     */
    public static boolean isValidFileExt(String ext) {
        ext = ext.toLowerCase(Locale.ENGLISH);
        for (String s : FILE_EXT) {
            if (s.equalsIgnoreCase(ext)) {
                return true;
            }
        }
        return false;
    }

上传代码 

 /**
     *  文件上传
     * @param file 文件
     * @param path 文件名称
     * @return 文件地址
     * @throws IOException
     */
    public String upLoadCos(InputStream file, String path,String unionId,String hospitalId)throws IOException {
        //涉及到的地方比较多,建议写个公共模块。
        //下面会po出获取桶和cos服务器代码
        String bucket = getBucket(unionId, hospitalId);
        COSClient cosClient = getCOSClient(unionId, hospitalId);
        // 指定要上传到 COS 上对象键
        String ext = FilenameUtils.getExtension(path);
        if(!isValidFileExt(ext)){
            throw new ServiceException("文件类型不支持!");
        }
        ObjectMetadata objectMetadata = new ObjectMetadata();
        objectMetadata.setContentLength(file.available());
        PutObjectRequest putObjectRequest = new PutObjectRequest(bucket, path, file,objectMetadata);
        PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest);
        return "https://"+putObjectRequest.getBucketName()+".cos.ap-shanghai.myqcloud.com/"+path;
    }

 上传文件之后就会获取到一串cos的URL:bucketName+cos服务器+文件名

https://wjytest-1251304050.cos.ap-shanghai.myqcloud.com/457cf133da90c99e121fc4615a6fce13.jpg

不过这个时候打开你会发现是看不到的,这是因为cos进行加密了。这个时候就用到了下面这个获取私有读权限来获取文件了。

获取请求预签名:

 /**
     * 获取请求预签名 URL
     * @param unionId
     * @param hospitalId
     * @return
     * @throws CosClientException
     */
    public URL generatePresignedUrl(String unionId,String hospitalId,String picUrl)throws CosClientException{
        String bucket = getBucket(unionId, hospitalId);
        GeneratePresignedUrlRequest req =
                new GeneratePresignedUrlRequest(bucket, picUrl, HttpMethodName.GET);
        // 设置签名过期时间(可选), 若未进行设置, 则默认使用 ClientConfig 中的签名过期时间(1小时)
        // 这里设置签名在半个小时后过期
        Date expirationDate = new Date(System.currentTimeMillis() + 30L * 60L * 1000L);
        req.setExpiration(expirationDate);
        COSClient cosClient = getCOSClient(unionId, hospitalId);
        URL url = cosClient.generatePresignedUrl(req);
        log.info(url.toString());
        cosClient.shutdown();
        return url;
    }

然后通过这个接口获取到的URL就可以打开上传的文件了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值