OSS管理文件(Java)

工具类

package com.panchina.util;


import com.alibaba.druid.util.StringUtils;
import com.aliyun.oss.HttpMethod;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.GeneratePresignedUrlRequest;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.auth.sts.AssumeRoleRequest;
import com.aliyuncs.auth.sts.AssumeRoleResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.InputStream;
import java.net.URL;
import java.util.Calendar;
import java.util.Date;


/**
 * 阿里云OSS
 */
@Slf4j
@Component
public class OssUtil {
    private static String endpoint ;

    private static String sts ;

    private static String accessKeyId;

    private static String accessKeySecret;

    private static String stsKeyId;

    private static String stsKeySecret;

    private static String roleArn;

    private static String bucketName;
    private static int duration;

    @Value("${aliyun.oss.accessKeySecret}")
    public void setAccessKeySecret(String accessKeySecret) {
        OssUtil.accessKeySecret = accessKeySecret;
    }
    @Value("${aliyun.oss.accessKeyId}")
    public void setAccessKeyId(String accessKeyId) {
        OssUtil.accessKeyId = accessKeyId;
    }
    @Value("${aliyun.oss.stsKeyId}")
    public void setStsKeyId(String stsKeyId) {
        OssUtil.stsKeyId = stsKeyId;
    }
    @Value("${aliyun.oss.stsKeySecret}")
    public void setStsKeySecret(String stsKeySecret) {
        OssUtil.stsKeySecret = stsKeySecret;
    }
    @Value("${aliyun.oss.endpoint}")
    public void setEndpoint(String endpoint) {
        OssUtil.endpoint = endpoint;
    }
    @Value("${aliyun.oss.sts}")
    public void setSts(String sts) {
        OssUtil.sts = sts;
    }

    @Value("${aliyun.oss.duration}")
    public void setduration(int duration) {
        OssUtil.duration = duration;
    }
    @Value("${aliyun.oss.roleArn}")
    public void setroleArn(String roleArn) {
        OssUtil.roleArn = roleArn;
    }
    @Value("${aliyun.oss.bucketName}")
    public void setBucketName(String bucketName) {
        this.bucketName = bucketName;
    }
    /**
     * 返回sts_token
     * @return
     */
    public static AssumeRoleResponse getSecurityToken(String roleSessionName) {
        try {
            // 添加endpoint(直接使用STS endpoint,前两个参数留空,无需添加region ID)
            DefaultProfile.addEndpoint("", "", "Sts", sts);

            // 构造default profile(参数留空,无需添加region ID)
            IClientProfile profile = DefaultProfile.getProfile("", stsKeyId, stsKeySecret);
            // 用profile构造client
            DefaultAcsClient client = new DefaultAcsClient(profile);
            final AssumeRoleRequest request = new AssumeRoleRequest();
            request.setMethod(MethodType.POST);
            request.setRoleArn(roleArn);
            // RoleSessionName 是临时Token的会话名称,自己指定用于标识你的用户,主要用于审计,或者用于区分Token颁发给谁
            // 但是注意RoleSessionName的长度和规则,不要有空格,只能有'-' '_' 字母和数字等字符
            request.setRoleSessionName(roleSessionName);
            request.setPolicy(null); // 若policy为空,则用户将获得该角色下所有权限
            request.setDurationSeconds(duration*60L); // 设置凭证有效时间
            final AssumeRoleResponse response = client.getAcsResponse(request);
            return response;
        } catch (ClientException e) {
            log.info(e.getErrMsg());
            return null;
        }
    }

    public static String uploadObjectByInputStream(InputStream inputStream, String folder, String fileName ){
        //folder+/+fileName
        OSS client=new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        String key;
        if(StringUtils.isEmpty(folder)){
            key = fileName;
        }else{
            key = folder + fileName;
        }
        try{
            client.putObject(bucketName, key, inputStream);
        }catch (Exception e){
            throw e;
        }finally {
            client.shutdown();
        }
        return key;
    }

    /**
     * 上传文件-全路径(a/b/c/filename)(流的形式-ecs免流量)
     * @param inputStream 文件流
     * @param fileFullPath 文件全路径(保留后缀)
     * @return 保存的文件key
     */
    public static String uploadObjectByInputStream(InputStream inputStream, String fileFullPath) throws Exception{
        OSS client=new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        try{
            client.putObject(bucketName, fileFullPath, inputStream);
        }catch (Exception e){
            throw e;
        }finally {
            client.shutdown();
        }
        return fileFullPath;
    }
    /**
     * 根据文件名获取文件访问URL(外网访问-下行收费)
     * @param ossFileKey 文件名
     * @param expires URL有效时间(分钟)
     * @return
     */
    public static String getFileUrl(String ossFileKey, int expires) {
        OSS client=new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        URL url = client.generatePresignedUrl(bucketName, ossFileKey, dateAfter(new Date(), expires, Calendar.MINUTE));
        String path = url.toString();
        return path;
    }

    /**
     * 根据文件名获取文件访问URL(外网访问-下行收费)
     * @param ossFileKey 文件名
     * @return
     */
    public static String getresizeFileUrl(String ossFileKey) {
        OSS client=new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        // 设置图片处理样式。
        String style = "image/resize,m_fixed,w_305,h_200";
        // 指定过期时间为10分钟。
        Date expiration = dateAfter(new Date(), 30, Calendar.MINUTE);
        GeneratePresignedUrlRequest req = new GeneratePresignedUrlRequest(bucketName, ossFileKey, HttpMethod.GET);
        req.setExpiration(expiration);
        req.setProcess(style);
        String path = client.generatePresignedUrl(req).toString();
        return path;
    }
    /**
     * 删除文件
     * @param folder 文件夹
     * @param fileName 文件名
     * @return
     */
    public static void deleteFile(String folder, String fileName){
        OSS client=new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        String key;
        if(StringUtils.isEmpty(folder)){
            key = fileName;
        }else{
            key = folder + fileName;
        }
        client.deleteObject(bucketName,key);
        client.shutdown();
    }

    /**
     * (private)获得指定日期之后一段时期的日期。例如某日期之后3天的日期等。
     * @param origDate 基准日期
     * @param amount 基准日期
     * @param timeUnit 时间单位,如年、月、日等。用Calendar中的常量代表
     * @return
     */
    private static final Date dateAfter(Date origDate, int amount, int timeUnit) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(origDate);
        calendar.add(timeUnit, amount);
        return calendar.getTime();
    }
}

上传文件

@Transactional(rollbackFor=Exception.class)
    public void buildUpload(MultipartFile[] files, long postId, Date now, Long loginId) throws Exception {
        PostAttachment postAttachment = new PostAttachment();
        String uploadUrl = null;
        String imgUrl = null;
        for (MultipartFile file : files) {
            Integer resultType = opinionFileType(file);
            String fileSuffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1);

            uploadUrl = OssUtil.uploadObjectByInputStream(file.getInputStream(),"partyCircle/"+PrimaryKeyUtil.getPrimaryKeyId()+"."+fileSuffix);
 //            if (resultType == 1) {
//                uploadUrl = imageFileService.upload(file);
//            }else if (resultType == 2){
//                uploadUrl=videoFileService.uploadvideoAndImage(file).get(0);
//                imgUrl=videoFileService.uploadvideoAndImage(file).get(1);
//            }
            postAttachment.setId(PrimaryKeyUtil.getPrimaryKeyId());
            postAttachment.setPostId(postId);
            postAttachment.setOrigSuffix(fileSuffix);
            postAttachment.setOrigUrl(uploadUrl);
            postAttachment.setType(resultType);
            postAttachmentMapper.insertSelective(postAttachment);
        }
    }

获取文件

 public List<ForumPostVO> selectForumPostList(ForumPostListQuery forumPostListQuery) {
        List<ForumPostVO> forumPostVOList = new ArrayList<>();
        List<ForumPostVO> forumPostVOS = forumPostMapperExt.selectForumPostList(forumPostListQuery);      
        if (forumPostVOS.isEmpty()) {
            return forumPostVOS;
        }
        List<Long> idList=forumPostVOS.stream().map(ForumPostVO::getId).collect(Collectors.toList());
        List<PostAttachment> attachmentList = postAttachmentMapperExt.getPostAttachment(idList);
        for (PostAttachment curr:attachmentList) {
            String origUrl=curr.getOrigUrl();
            if(origUrl != null && origUrl.length() > 0){
                if(curr.getType().equals(1)){
                    String url= OssUtil.getresizeFileUrl(origUrl);
                    curr.setOrigUrl(url);
                }
                else
                {
                    String url= OssUtil.getFileUrl(origUrl,30);
                    curr.setOrigUrl(url);
                }
            }
        }

        Collections.sort(forumPostVOList, new Comparator<ForumPostVO>() {
            @Override
            public int compare(ForumPostVO f1, ForumPostVO f2) {
                return f2.getCreateTime().compareTo(f1.getCreateTime());
            }
        });
        return forumPostVOList;
    }

 

posted @ 2020-07-16 09:29  艺洁  阅读(783)  评论(0编辑  收藏  举报