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

如何用AWS SDK for .NET开发WinForm应用上传文件至Digital Ocean Space?

C# WinForm 上传文件至 Digital Ocean Spaces 技术方案

核心依赖选择

Digital Ocean Spaces 兼容 S3 API,直接使用 AWS SDK for .NET(AWSSDK.S3)即可,官方维护更稳定。通过 NuGet 安装:
Install-Package AWSSDK.S3

基础配置与初始化

  1. 获取 Spaces 凭证:在 Digital Ocean 控制台创建 Spaces Access Key 和 Secret Key,同时记录你的 Spaces 区域(如 nyc3)和空间名称。
  2. 初始化 S3 客户端:指定 Digital Ocean 自定义服务端点,示例代码:
using Amazon.S3;
using Amazon.S3.Transfer;

var config = new AmazonS3Config
{
    ServiceURL = "https://nyc3.digitaloceanspaces.com",
    SignatureVersion = "v4",
    RegionEndpoint = Amazon.RegionEndpoint.GetBySystemName("nyc3")
};

var s3Client = new AmazonS3Client("你的AccessKey", "你的SecretKey", config);

WinForm UI 核心功能实现

1. 文件选择功能

使用 OpenFileDialog 支持单/多文件选择:

private void btnSelectFiles_Click(object sender, EventArgs e)
{
    using var openFileDialog = new OpenFileDialog
    {
        Multiselect = true,
        Filter = "所有文件 (*.*)|*.*"
    };

    if (openFileDialog.ShowDialog() == DialogResult.OK)
    {
        lstSelectedFiles.Items.AddRange(openFileDialog.FileNames);
    }
}

2. 文件上传实现

借助 TransferUtility 简化上传流程,支持实时进度跟踪:

private async void btnUpload_Click(object sender, EventArgs e)
{
    if (lstSelectedFiles.Items.Count == 0) return;

    var transferUtility = new TransferUtility(s3Client);
    var spaceName = "你的空间名称";

    foreach (var filePath in lstSelectedFiles.Items.Cast<string>())
    {
        try
        {
            var fileName = Path.GetFileName(filePath);
            var uploadRequest = new TransferUtilityUploadRequest
            {
                FilePath = filePath,
                BucketName = spaceName,
                Key = fileName,
                CannedACL = S3CannedACL.Private // 可根据需求改为PublicRead
            };

            uploadRequest.UploadProgressEvent += (s, args) =>
            {
                Invoke((Action)(() =>
                {
                    lblStatus.Text = $"上传中:{args.PercentDone}%";
                    progressBar.Value = args.PercentDone;
                }));
            };

            await transferUtility.UploadAsync(uploadRequest);
        }
        catch (Exception ex)
        {
            MessageBox.Show($"上传失败:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

    MessageBox.Show("所有文件上传完成", "完成", MessageBoxButtons.OK, MessageBoxIcon.Information);
}

3. 类Cyberduck扩展功能

  • 文件夹上传:用 FolderBrowserDialog 选择文件夹,递归遍历所有文件执行上传。
  • 远程文件列表:调用 ListObjectsV2Async 获取 Spaces 内文件列表,展示在 DataGridView 中。
  • 断点续传:TransferUtility 默认支持分块上传(超过100MB自动触发),无需额外编码。
  • 凭证加密存储:使用 System.Security.Cryptography.ProtectedData 加密保存 Access Key/Secret Key,避免明文泄露。

注意事项

  • 权限控制:确保使用的 Access Key 仅拥有 Spaces 写入权限,不要使用全局管理员凭证。
  • 异常处理:补充网络异常、权限异常等捕获逻辑,优化用户提示。
  • 大文件优化:对于超大文件,可手动调整分块大小,避免内存溢出。

内容的提问来源于stack exchange,提问作者Phạm Vương

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 12:45:46