You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

S3预签名URL打开文件而非下载的问题及解决方法

S3预签名URL访问TXT文件:从浏览器直接打开恢复自动下载的解决办法

场景概述

将TXT文件上传至S3文件夹并生成预签名URL供访问。此前点击URL会自动下载文件,如今浏览器直接打开文件(浏览器配置未更改),需确认是通过S3配置还是在上传请求中添加Content-Disposition字段强制下载,以及针对TXT文件的正确配置方式。

原始上传代码

try{
    context.getLogger().log("Uploading a new object to S3 from a file\n");
    PutObjectRequest request;
    String keyObject = folder + "/" + fileName;
    request = new PutObjectRequest(bucket, keyObject, file.getAbsoluteFile());
    s3Config.getS3Client().putObject(request);
    return "SUCCESS:" + s3Config.getS3Client().getUrl(bucket, folder + "/" + fileName);
}

预签名URL生成代码

try {
    java.util.Date expiration = new java.util.Date();
    long expTimeMillis = Instant.now().toEpochMilli();
    expTimeMillis += 1000 * 60 * 60;
    expiration.setTime(expTimeMillis);

    System.out.println("Generating pre-signed URL.");
    GeneratePresignedUrlRequest generatePresignedUrlRequest =
            new GeneratePresignedUrlRequest(bucketName, objectKey)
                    .withMethod(HttpMethod.GET)
                    .withExpiration(expiration);
    URL url = s3Config.getS3Client().generatePresignedUrl(generatePresignedUrlRequest);
    return url;

}

注:objectKey的取值为folder + "/" + filename,其中filename包含.txt扩展名

解决方案

在上传文件时,通过ObjectMetadata为PutObjectRequest设置Content-Disposition元数据为attachment,即可强制浏览器触发文件下载,问题已解决。

修改后的上传代码

PutObjectRequest request;
String keyObject = folder + "/" + fileName;
request = new PutObjectRequest(bucket, keyObject, file.getAbsoluteFile());
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentDisposition("attachment");
request.setMetadata(metadata);
s3Config.getS3Client().putObject(request);

内容的提问来源于stack exchange,提问作者Aditya K

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 19:55:14