java_oss_微信小程序_通过临时签名url访问oss中存储的图像

1. 使用版本

spring boot 3.2.5

java 复制代码
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.5</version>
    </parent>    
       
        <alibaba.version>2023.0.3.3</alibaba.version>
        <springframework.version>2023.0.1</springframework.version>           

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${springframework.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

ali oss 3.17.4

java 复制代码
            <dependency>
                <groupId>com.aliyun.oss</groupId>
                <artifactId>aliyun-sdk-oss</artifactId>
                <version>3.17.4</version>
            </dependency>

2. java端获取签名的url

建一个OssConfig配置类, 定义OSS对象 ossClient:

java 复制代码
package com.johnsport.ppzy.advertise.config;

import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyuncs.exceptions.ClientException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class OssConfig {

    //知识点:使用@Value读取application-dev.yml文件中的属性值
    @Value("${aliyun.endpoint}")
    private String endpoint;
    //    @Value("${aliyun.keyid}")
    //    private String keyid;
    //    @Value("${aliyun.keysecret}")
    //    private String keysecret;
    @Value("${aliyun.bucketname}")
    private String bucketName;
    @Value("${aliyun.region}")
    private String region;

    @Bean
    public OSS ossClient() throws ClientException {
        // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        EnvironmentVariableCredentialsProvider credentialsProvider =
                CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();

        // 当OSSClient实例不再使用时,调用shutdown方法以释放资源。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);

        //参考文档:https://help.aliyun.com/zh/oss/developer-reference/simple-upload-11?spm=a2c4g.11186623.help-menu-31815.d_3_2_0_3_0_0.6ef81855hqyaRP
        // https://help.aliyun.com/zh/oss/developer-reference/simple-upload-11?spm=a2c4g.11186623.help-menu-31815.d_5_2_1_3_0_0.59f61a9cviNbZl

        // 创建OSSClient实例。
        OSS ossClient = OSSClientBuilder.create()
                .endpoint(endpoint)
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(clientBuilderConfiguration)
                .region(region)
                .build();

        return ossClient;
    }
}

3. 定义获取图像接口:

java 复制代码
    /**
     * 获取 OSS 图片签名 URL
     */
    @Operation(summary = "获取OSS图片")
    @GetMapping(value = "/getImage")  // 强制声明返回类型)
    public Result getImageUrl(
            @Parameter(description = "OSS中文件名称", example = "/2025/06/10/abc.png")
            @RequestParam("objectName") String objectName) throws ClientException {

        System.out.println("objectName:" + objectName);
        String file_url = ossService.generatePresignedUrl(objectName);
        return Result.ok(file_url);
    }

定义ossService:

java 复制代码
package com.your.package.name.service.impl;

import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.HttpMethod;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.GeneratePresignedUrlRequest;
import com.aliyuncs.exceptions.ClientException;
import com.johnsport.ppzy.advertise.service.OssService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.awt.desktop.SystemEventListener;
import java.net.URL;
import java.util.Date;

@Service
public class OssServiceImpl implements OssService {

    @Autowired
    private OSS ossClient;

    @Value("${aliyun.bucketname}")
    private String bucketName;

    @Override
    public String generatePresignedUrl(String objectName) throws ClientException {

        try {
            // 2. 设置URL过期时间
            Date expiration = new Date(System.currentTimeMillis() + 3600 * 1000);
            // 3. 生成签名URL
            GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(
                    bucketName,
                    objectName,
                    HttpMethod.GET
            );
            request.setExpiration(expiration);
            request.setProcess("image/resize,w_500"); // 强制返回图片而非下载
            // request.setContentType("image/jpg"); // 明确响应类型

            URL signedUrl = ossClient.generatePresignedUrl(request);
            String resultUrl = signedUrl.toString();
            System.out.println("resultUrl:" + resultUrl);
            // 返回给前端的URL示例:
            // https://your-bucket-name.oss-cn-beijing.aliyuncs.com/2025/06/09/image.jpg?OSSAccessKeyId=xxx&Expires=xxx&Signature=xxx
            return resultUrl;

        } catch (Exception ce) {
            System.out.println("Caught an ClientException, when generatePresignedUrl");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
        return null;
    }

}

使用curl 命令即可获取到临时签名的图像url:

4. OSS规则设置:

防盗链规则设置:添加"*servicewechat.com" (这条最关键)

其它安全设置:

读写权限设置:

跨域设置:

阻止公共访问: