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
相关产品推荐
相关产品推荐

