minio 获取外链时替换连接地址

52 阅读1分钟

新建MinioAsyncClient子类,重载getPresignedObjectUrl 方法


public class CustomizedClient extends MinioAsyncClient {
    private String domainUrl;

    public CustomizedClient(MinioAsyncClient client) {
        super(client);
    }
    
    
    public String getPresignedObjectPublicUrl(GetPresignedObjectUrlArgs args) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException,
            InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
        return getPresignedObjectUrl(args, domainUrl);
    }


    public String getPresignedObjectUrl(GetPresignedObjectUrlArgs args, String domainUrl)
            throws ErrorResponseException, InsufficientDataException, InternalException,
                InvalidKeyException, InvalidResponseException, IOException,NoSuchAlgorithmException,
            XmlParserException, ServerException {
        checkArgs(args);

        byte[] body = (args.method() == Method.PUT || args.method() == Method.POST) ? EMPTY_BODY : null;

        Multimap<String, String> queryParams = newMultimap(args.extraQueryParams());
        if (args.versionId() != null) {
            queryParams.put("versionId", args.versionId());
        }

        String region = getRegion(args.bucket(), args.region());
        if (provider == null) {
            HttpUrl url = buildUrl(args.method(), args.bucket(), args.object(), region, queryParams);
            return url.toString();
        }

        Credentials creds = provider.fetch();
        if (creds.sessionToken() != null) {
            queryParams.put("X-Amz-Security-Token", creds.sessionToken());
        }
        HttpUrl url = buildUrl(args.method(), args.bucket(), args.object(), region, queryParams);
        // 如果需要去掉端口的话
        //String withoutPort = removeLastPortIfMultipleColons(domainUrl);
        String withoutPort = domainUrl;
        // 重点在这里,这部分修改访问地址,修改方式就是直接将baseurl替换成自定义的地址
        if (endpoint != null) {
            url = url.newBuilder(url.toString().replace(baseUrl.toString(), withoutPort + File.separator)).build();
        }
        Request request =
                createRequest(
                        url,
                        args.method(),
                        args.extraHeaders() == null ? null : httpHeaders(args.extraHeaders()),
                        body,
                        0,
                        creds);
        url = Signer.presignV4(request, region, creds.accessKey(), creds.secretKey(), args.expiry());
        return url.toString().replace(withoutPort, domainUrl);
    }
}

配置类

@Configuration
public class Config {

    @Bean
    public CustomizedClient customizedClient() {
        CustomizedClient customizedClient = new CustomizedClient(asyncClient());
        customizedClient.setDomainUrl("url");
        return customizedClient;
    }

    @Bean
    public MinioAsyncClient asyncClient() {
        MinioAsyncClient.Builder minioClientBuilder = MinioAsyncClient.builder();
        return minioClientBuilder.endpoint("url").credentials("ak", "sk").build();
    }
}