BUG记录 | 使用阿里云OSS实现文件上传后,得到的url无法在浏览器中打开

项目背景

SpringBoot的项目,使用阿里云对象存储OSS对项目中的文件进行存储,所需文件也会通过IDEA中由官方Demo改编而成的工具类作为接口,调用接口后上传

问题描述

使用阿里云OSS实现文件上传后,通过postman测试得到的url无法在浏览器中打开

原因分析

url 的拼接有问题

获取到的url如下

vbnet 复制代码
{
    "code": 0,
    "message": "操作成功",
    "data": "https://finger-art.oss-cn-shanghai.aliyuncs.com96caa8xxx.png"
}

可以看到在 aliyun.com 后少了一个 "/",正确的路径应该是 https://finger-art.oss-cn-shanghai.aliyuncs.com/96caa8xxx.png

java 复制代码
package cn.itcast.product.Utils;

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.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;


import java.io.InputStream;

public class ALiOssUtil {

    // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
    private static final String ENDPOINT = "https://oss-cn-shanghai.aliyuncs.com";

    // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
    // EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
    private static final String ACCESS_KEY_ID="xxx";
    private static final String ACCESS_KEY_SECRET="xxx";

    // 填写Bucket名称,例如examplebucket。
    private static final String BUCKET_NAME = "finger-art";

    public static String upLoadFile(String objectName, InputStream inputStream) throws Exception {



        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID,ACCESS_KEY_SECRET);
        String url="";
        try {
            // 填写字符串。
            String content = "Hello OSS,你好世界";

            // 创建PutObjectRequest对象。
            PutObjectRequest putObjectRequest = new PutObjectRequest(BUCKET_NAME, objectName,inputStream);

            // 如果需要上传时设置存储类型和访问权限,请参考以下示例代码。
            // ObjectMetadata metadata = new ObjectMetadata();
            // metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
            // metadata.setObjectAcl(CannedAccessControlList.Private);
            // putObjectRequest.setMetadata(metadata);

            // 上传字符串。
            PutObjectResult result = ossClient.putObject(putObjectRequest);
            url = "https://"+BUCKET_NAME+"."+ ENDPOINT.substring(ENDPOINT.lastIndexOf("/")+1)+ objectName;

        } 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 {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
        return url;
    }
}

在这里出现问题

解决方案

下面这条语句是截取了字符串 ENDPOINT,从最后一个 "/" 开始截取,其结果应该为 oss-cn-shanghai.aliyuncs.com,因此需要在这条语句后再加上一个 "/" 才能达到效果

java 复制代码
ENDPOINT.substring(ENDPOINT.lastIndexOf("/")+1

正确语句如下

java 复制代码
 url = "https://"+BUCKET_NAME+"."+ ENDPOINT.substring(ENDPOINT.lastIndexOf("/")+1)+"/"+ objectName;

测试



成功下载,上传成功!

相关推荐
Evan Wang18 分钟前
使用Terraform管理阿里云基础设施
阿里云·云原生·terraform
xiaogg367820 分钟前
springboot rabbitmq 延时队列消息确认收货订单已完成
spring boot·rabbitmq·java-rabbitmq
麦兜*22 分钟前
MongoDB 6.0 新特性解读:时间序列集合与加密查询
数据库·spring boot·mongodb·spring·spring cloud·系统架构
依稀i12332 分钟前
Spring Boot + MySQL 创建超级管理员
spring boot·mysql
千里码aicood37 分钟前
【springboot+vue】党员党建活动管理平台(源码+文档+调试+基础修改+答疑)
java·数据库·spring boot
Chan1641 分钟前
【智能协同云图库】基于统一接口架构构建多维度分析功能、结合 ECharts 可视化与权限校验实现用户 / 管理员图库统计、通过 SQL 优化与流式处理提升数据
java·spring boot·后端·sql·spring·intellij-idea·echarts
库库林_沙琪马1 小时前
REST接口幂等设计深度解析
spring boot·后端
衍余未了3 小时前
k8s 内置的containerd配置阿里云个人镜像地址及认证
java·阿里云·kubernetes
蒋星熠3 小时前
深入 Kubernetes:从零到生产的工程实践与原理洞察
人工智能·spring boot·微服务·云原生·容器·架构·kubernetes