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

在ASP.NET中设置指向S3存储桶文件的下载链接

解决方案:ASP.NET页面生成S3文件下载链接

前提准备

  • 确保ASP.NET项目已安装AWS SDK for S3包,通过NuGet安装:Install-Package AWSSDK.S3(.NET Framework)或dotnet add package AWSSDK.S3(.NET Core/.NET 5+)
  • 配置AWS凭证:可通过appsettings.json、环境变量或IAM角色配置(生产环境优先用IAM角色,避免硬编码凭证)

方法1:后端生成预签名URL(适配私有S3桶)

如果S3桶为私有默认权限,必须通过预签名URL授予临时访问权限,代码示例如下:

Razor Pages 示例(.NET Core/.NET 5+)

  1. PageModel逻辑(后端生成链接):
using Amazon.S3;
using Amazon.S3.Model;
using System.IO;

public class FileDownloadModel : PageModel
{
    private readonly IAmazonS3 _s3Client;

    public List<(string FileName, string DownloadUrl)> FileLinks { get; set; } = new();

    public FileDownloadModel(IAmazonS3 s3Client)
    {
        _s3Client = s3Client;
    }

    public async Task OnGetAsync()
    {
        string bucketName = "your-s3-bucket-name";
        // 指定要读取的文件夹
        string[] targetFolders = { "image/", "icon/" };

        foreach (var folder in targetFolders)
        {
            var listRequest = new ListObjectsV2Request
            {
                BucketName = bucketName,
                Prefix = folder,
                Delimiter = "/" // 仅读取当前文件夹下的文件,不递归子目录
            };

            var listResponse = await _s3Client.ListObjectsV2Async(listRequest);

            foreach (var s3Obj in listResponse.S3Objects)
            {
                // 跳过文件夹本身的占位对象
                if (s3Obj.Key == folder) continue;

                // 生成有效期1小时的预签名URL,强制浏览器下载而非预览
                var preSignRequest = new GetPreSignedUrlRequest
                {
                    BucketName = bucketName,
                    Key = s3Obj.Key,
                    Expires = DateTime.UtcNow.AddHours(1),
                    ResponseHeaderOverrides = new ResponseHeaderOverrides
                    {
                        ContentDisposition = $"attachment; filename=\"{Path.GetFileName(s3Obj.Key)}\""
                    }
                };

                string preSignedUrl = _s3Client.GetPreSignedURL(preSignRequest);
                FileLinks.Add((Path.GetFileName(s3Obj.Key), preSignedUrl));
            }
        }
    }
}
  1. 前端Razor页面渲染链接:
<h3>可下载文件列表</h3>
<ul>
    @foreach (var (fileName, url) in Model.FileLinks)
    {
        <li><a href="@url" target="_blank">@fileName</a></li>
    }
</ul>

方法2:直接使用公有对象URL(适配公开可读的桶)

如果S3桶或目标文件已设置公开可读权限,可直接构造URL:

// URL格式:https://{桶名}.s3.{区域}.amazonaws.com/{文件键}
string publicDownloadUrl = $"https://your-bucket-name.s3.us-east-1.amazonaws.com/image/test.png";

前端用<a>标签配合download属性强制下载(部分浏览器支持):

<a href="@publicDownloadUrl" download>下载test.png</a>

注意事项

  • 权限安全:私有桶必须用预签名URL,避免敏感文件泄露;公有桶仅开放必要文件的读权限,不要全局公开整个桶
  • 文件名处理:若文件名含中文或特殊字符,需在ResponseHeaderOverrides中设置编码(如filename*=UTF-8''{编码后的文件名}),避免下载后乱码
  • 凭证管理:生产环境优先使用ECS/EKS角色、EC2实例角色等方式配置凭证,禁止硬编码密钥

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 12:47:22