OSS文件上传和STStoken临时授权访问

本文档详细介绍了如何使用Java实现阿里云OSS文件上传和获取STSToken进行临时授权访问。代码示例包括文件上传、设置元信息、根据路径获取STSToken以及获取文件类型的函数,同时提供了三种访问OSS文件的方式:直接使用OSS外网地址、通过Nginx代理和ECS内网代理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OSS文件上传和STStoken临时授权访问

整了好几天,从OSS角色权限配置到代码,整的脑壳痛,终于好了。
配置就不在这里展开了,都搜得到。
话不多说,上代码。差不多也是网上代码整理的。

文件上传

/**
     * 存储文件到oss服务器
     * 返回保存路径(自定义路径+文件名)。
     *
     * @return
     * @throws Exception
     */
    public static String ossSave(MultipartFile file, String path) throws IOException {
        if (file != null) {
            // 文件原始名称
            String originalFilename = file.getOriginalFilename();
            // 上传图片
            if (originalFilename != null && originalFilename.length() > 0) {
                try {
                    // 文件名称
                    String newFileName = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));
                    // 新文件
                    //按日期存储
                    String date_path = "/" + new DateTime().toString("yyyy/MM/dd");
                    //path + filename
                    String filename = OssUtils.objectName + path + date_path + "/" + newFileName;
                    //创建oss实例
                    OSS ossClient = new OSSClientBuilder().build(OssUtils.endpoint, OssUtils.accessKeyId, OssUtils.accessKeySecret);

                    //设置元信息 没有这个参数,访问文件时会变成下载文件。 元信息文档:https://help.aliyun.com/document_detail/31859.htm?spm=a2c4g.11186623.2.2.5e963686lk09hW#concept-lkf-swy-5db
                    ObjectMetadata objectMetadata = new ObjectMetadata();
                    objectMetadata.setContentType(FileUtil.getContentType(newFileName));
                    //上传文件流
                    InputStream inputStream = file.getInputStream();
                    //调用oss方法实现上传
                    //第一个参数 Bucket名称
                    //第二个参数 上传到oss 文件路径和文件名称
                    //第三个参数 上传文件输入流
                    //第四个参数 设置元信息
                    ossClient.putObject(OssUtils.bucketName, filename, inputStream, objectMetadata);
                    //关闭ossclient
                    ossClient.shutdown();
                    //返回上传之后文件路径
                    return /*"https://" + OssUtils.bucketName + "." + OssUtils.endpoint + */"/" + filename;
                } catch (Exception e) {
                    e.printStackTrace();
                    throw e;
                }
            }
        }
        return null;
    }

根据保存路径获取oss文件临时访问权限STStoken

/**
     *
     * @param url example: /file/a.jpg
     * @return Expires + OSSAccessKeyId + Signature
     */
    public static String getSTSToken(String url) {
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        Date date = new Date(System.currentTimeMillis() + 15 * 60 * 1000);
        URL newUrl = ossClient.generatePresignedUrl(bucketName, url.substring(1), date);
        String ossUrl = newUrl.toString();
        ossClient.shutdown();
        return ossUrl.split("\\?")[1];
    }

获取文件类型方法

public static String getContentType(String FilenameExtension) {
        if (FilenameExtension.equalsIgnoreCase(".bmp")) {
            return "image/bmp";
        }
        if (FilenameExtension.equalsIgnoreCase(".gif")) {
            return "image/gif";
        }
        if (FilenameExtension.equalsIgnoreCase(".jpeg") ||
                FilenameExtension.equalsIgnoreCase(".jpg") ||
                FilenameExtension.equalsIgnoreCase(".png")) {
            return "image/jpg";
        }
        if (FilenameExtension.equalsIgnoreCase(".html")) {
            return "text/html";
        }
        if (FilenameExtension.equalsIgnoreCase(".txt")) {
            return "text/plain";
        }
        if (FilenameExtension.equalsIgnoreCase(".vsd")) {
            return "application/vnd.visio";
        }
        if (FilenameExtension.equalsIgnoreCase(".pptx") ||
                FilenameExtension.equalsIgnoreCase(".ppt")) {
            return "application/vnd.ms-powerpoint";
        }
        if (FilenameExtension.equalsIgnoreCase(".docx") ||
                FilenameExtension.equalsIgnoreCase(".doc")) {
            return "application/msword";
        }
        if (FilenameExtension.equalsIgnoreCase(".xml")) {
            return "text/xml";
        }
        return "image/jpg";
    }

访问

方式一:OSS外网地址+OSS文件路径。该方式会暴露bucket地址(不推荐)
bucketName + endpoint + filename
在这里插入图片描述

方式二:nginx 代理OSS外网地址访问,隐藏你的bucket地址,相对安全一些(推荐)
在这里插入图片描述

方式三:ECS 代理OSS内网地址访问(强烈推荐)
优点:1.可掩盖OSS原始路径,安全;2.通过同地域ECS访问OSS,不收流量费
缺点:OSS访问的速度受限于ECS的带宽
在这里插入图片描述

nginx 代理访问配置

请参考:

nginx 代理访问配置

over…
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值