将 zip 从 Blazor WASM 应用程序上传到 AWS-S3 - 遵循教程,没有观察到错误,但存储桶中也没有文件

2024-05-15

我有一个 Blazor WASM 应用程序(即客户端),用户可以向其中上传一些数据。对数据进行一些完整性和安全性检查后,我想将这些数据上传到 AWS S3 中的 zip 文件中。

目前我已经构建了 zip 文件,如下所示

using (var outStream = new MemoryStream())
{
    using (var archive = new ZipArchive(outStream, ZipArchiveMode.Create, true))
    {
        foreach (var file in imagelist.Files)
        {
            json_name = file.Name + ".json";
            var file_in_archive = archive.CreateEntry(file.Name, CompressionLevel.Optimal);
            using (var entryStream = file_in_archive.Open())
            {
                file.Data.CopyToAsync(entryStream);
            }
            file_in_archive = archive.CreateEntry(json_name, CompressionLevel.Optimal);
            using (var entryStream = file_in_archive.Open())
            {
                formMems[file_counter].CopyToAsync(entryStream);
            }
            file_counter = file_counter + 1;
        }

    }
    Console.WriteLine("Finished zipping");
    uploader.UploadZipFile(outStream, "test_title.zip");
}

我正在尝试通过此方法上传 zip 文件uploader.UploadZipFile- 代码如下

public class UploadZip    
{
    public BasicAWSCredentials credentials = new BasicAWSCredentials("access key", "secret key");
 
    public void UploadZipFile(Stream zip_file, string file_name)
    {
        zip_file.Seek(0, SeekOrigin.Begin);
        var config = new AmazonS3Config
        {
            RegionEndpoint = Amazon.RegionEndpoint.Region
        };
        using var client = new AmazonS3Client(credentials, config);
        var uploadRequest = new TransferUtilityUploadRequest
        {
            InputStream = zip_file,
            Key = file_name,
            BucketName = "Bucket-Name",
            CannedACL = S3CannedACL.Private
        };
        var fileTransferUtility = new TransferUtility(client);
        fileTransferUtility.UploadAsync(uploadRequest);
        Console.WriteLine("finshed uploading");
    }
}

(上传器是UploadZip 的一个实例)。出于显而易见的原因,我删除了存储桶名称、区域、访问密钥和秘密密钥,但这些都是正确的。

访问密钥和秘密密钥属于我为此目的创建的自定义 IAM 用户。政策摘要如下

{
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "VisualEditor0",
        "Effect": "Allow",
        "Action": "s3:PutObject",
        "Resource": "arn:aws:s3:::Bucket-Name/*"
    }
]

}

S3存储桶有Block *all* public access turned off,CORS 如下所示

[
{
    "AllowedHeaders": [
        "*"
    ],
    "AllowedMethods": [
        "PUT",
        "POST"
    ],
    "AllowedOrigins": [
        "*"
    ],
    "ExposeHeaders": []
}

]

ACL 授予存储桶所有者(您的 AWS 账户)List and Write for Objects, and Read and Write for 桶访问控制列表,其他 3 名受资助者没有其他任何东西。没有存储桶策略。

我根本不明白为什么这不起作用。当我运行该程序时,我没有看到任何错误,并且两个Console.write()通话运行良好。

edit

为了回应评论的建议,我尝试运行代码Upload而不是UploadAsync- 见下文

public class UploadZip    
{
    public BasicAWSCredentials credentials = new BasicAWSCredentials("AKIAZWFJ7CFNER3WG5EP", "EE9eMD/vz8G3Ui3/MZdGDNBY9xv4+/3y0VQAhNzn");
 
    public void UploadZipFile(Stream zip_file, string file_name)
    {
        zip_file.Seek(0, SeekOrigin.Begin);
        var config = new AmazonS3Config
        {
            RegionEndpoint = Amazon.RegionEndpoint.EUWest2
        };
        using var client = new AmazonS3Client(credentials, config);
        var uploadRequest = new TransferUtilityUploadRequest
        {
            InputStream = zip_file,
            Key = file_name,
            BucketName = "web-pupil-data-store",
            CannedACL = S3CannedACL.Private
        };
        var fileTransferUtility = new TransferUtility(client);
        fileTransferUtility.Upload(uploadRequest);
        Console.WriteLine("finshed uploading");
    }
}

这仍然完成了文件的压缩,但在打印之前finished uploading,它现在抛出一个错误,带有一个大而安静的难以理解的(对我来说)堆栈跟踪,复制到这里

blazor.webassembly.js:1 crit: Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100]
      Unhandled exception rendering component: Cannot start threads on this runtime.
System.NotSupportedException: Cannot start threads on this runtime.
  at (wrapper managed-to-native) System.Threading.Thread.Thread_internal(System.Threading.Thread,System.MulticastDelegate)
  at System.Threading.Thread.StartInternal (System.Object principal, System.Threading.StackCrawlMark& stackMark) <0x47bb958 + 0x00008> in <filename unknown>:0 
  at System.Threading.Thread.Start (System.Threading.StackCrawlMark& stackMark) <0x47bb818 + 0x0004e> in <filename unknown>:0 
  at System.Threading.Thread.Start () <0x47bb6d8 + 0x0000e> in <filename unknown>:0 
  at Amazon.Runtime.Internal.Util.BackgroundDispatcher`1[T]..ctor (System.Action`1[T] action) [0x0005c] in D:\JenkinsWorkspaces\trebuchet-stage-release\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\Internal\Util\Dispatcher.cs:55 
  at Amazon.Runtime.Internal.Util.BackgroundInvoker..ctor () [0x00000] in D:\JenkinsWorkspaces\trebuchet-stage-release\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\Internal\Util\Dispatcher.cs:180 
  at Amazon.Util.AWSSDKUtils.get_Dispatcher () [0x00007] in D:\JenkinsWorkspaces\trebuchet-stage-release\AWSDotNetPublic\sdk\src\Core\Amazon.Util\AWSSDKUtils.cs:674 
  at Amazon.Util.AWSSDKUtils.InvokeInBackground[T] (System.EventHandler`1[TEventArgs] handler, T args, System.Object sender) [0x0004c] in D:\JenkinsWorkspaces\trebuchet-stage-release\AWSDotNetPublic\sdk\src\Core\Amazon.Util\AWSSDKUtils.cs:661 
  at Amazon.Runtime.Internal.StreamReadTracker.ReadProgress (System.Int32 bytesRead) [0x00047] in D:\JenkinsWorkspaces\trebuchet-stage-release\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\Internal\StreamReadTracker.cs:55 
  at Amazon.Runtime.Internal.Util.EventStream.ReadAsync (System.Byte[] buffer, System.Int32 offset, System.Int32 count, System.Threading.CancellationToken cancellationToken) [0x0009c] in D:\JenkinsWorkspaces\trebuchet-stage-release\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\Internal\Util\EventStream.cs:138 
  at Amazon.Runtime.Internal.Util.ChunkedUploadWrapperStream.FillInputBufferAsync (System.Threading.CancellationToken cancellationToken) [0x00090] in D:\JenkinsWorkspaces\trebuchet-stage-release\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\Internal\Util\ChunkedUploadWrapperStream.cs:189 
  at Amazon.Runtime.Internal.Util.ChunkedUploadWrapperStream.ReadAsync (System.Byte[] buffer, System.Int32 offset, System.Int32 count, System.Threading.CancellationToken cancellationToken) [0x00053] in D:\JenkinsWorkspaces\trebuchet-stage-release\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\Internal\Util\ChunkedUploadWrapperStream.cs:163 
  at System.Threading.Tasks.ValueTask`1[TResult].get_Result () <0x370ff80 + 0x00034> in <filename unknown>:0 
  at System.IO.Stream.CopyToAsyncInternal (System.IO.Stream destination, System.Int32 bufferSize, System.Threading.CancellationToken cancellationToken) <0x36ee098 + 0x00134> in <filename unknown>:0 
  at System.Net.Http.HttpContent.LoadIntoBufferAsyncCore (System.Threading.Tasks.Task serializeToStreamTask, System.IO.MemoryStream tempBuffer) <0x49ea648 + 0x00110> in <filename unknown>:0 
  at System.Net.Http.HttpContent.WaitAndReturnAsync[TState,TResult] (System.Threading.Tasks.Task waitTask, TState state, System.Func`2[T,TResult] returnFunc) <0x49eba60 + 0x000c2> in <filename unknown>:0 
  at System.Net.Http.WebAssemblyHttpHandler.doFetch (System.Threading.Tasks.TaskCompletionSource`1[TResult] tcs, System.Net.Http.HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) <0x47cfe90 + 0x0038c> in <filename unknown>:0 
  at System.Net.Http.WebAssemblyHttpHandler.SendAsync (System.Net.Http.HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) <0x47af880 + 0x00174> in <filename unknown>:0 
  at System.Net.Http.HttpClient.FinishSendAsyncUnbuffered (System.Threading.Tasks.Task`1[TResult] sendTask, System.Net.Http.HttpRequestMessage request, System.Threading.CancellationTokenSource cts, System.Boolean disposeCts) <0x49ef528 + 0x00134> in <filename unknown>:0 
  at Amazon.Runtime.HttpWebRequestMessage.GetResponseAsync (System.Threading.CancellationToken cancellationToken) [0x0003d] in D:\JenkinsWorkspaces\trebuchet-stage-release\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\Pipeline\HttpHandler\_netstandard\HttpRequestMessageFactory.cs:520 
  at Amazon.Runtime.Internal.HttpHandler`1[TRequestContent].InvokeAsync[T] (Amazon.Runtime.IExecutionContext executionContext) [0x00201] in D:\JenkinsWorkspaces\trebuchet-stage-release\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\Pipeline\HttpHandler\HttpHandler.cs:183 
  at Amazon.Runtime.Internal.RedirectHandler.InvokeAsync[T] (Amazon.Runtime.IExecutionContext executionContext) [0x00036] in D:\JenkinsWorkspaces\trebuchet-stage-release\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\Pipeline\Handlers\RedirectHandler.cs:59 
  at Amazon.Runtime.Internal.U
f.printErr  @   blazor.webassembly.js:1
f.preRun.push.window.Blazor._internal.dotNetCriticalError   @   blazor.webassembly.js:1
_mono_wasm_invoke_js_unmarshalled   @   dotnet.3.2.0.js:1
do_icall    @   00755c3a:0x10f924
do_icall_wrapper    @   00755c3a:0x50b6a
interp_exec_method  @   00755c3a:0x2588e
interp_runtime_invoke   @   00755c3a:0xf7391
mono_jit_runtime_invoke @   00755c3a:0xddb3d
do_runtime_invoke   @   00755c3a:0x3ba85
mono_runtime_try_invoke @   00755c3a:0xcfdb
try_invoke_perform_wait_callback    @   00755c3a:0xb62e0
worker_callback @   00755c3a:0x9a7a3
fire_tp_callback    @   00755c3a:0x105481
mono_background_exec    @   00755c3a:0xeb5ee
Module._mono_background_exec    @   dotnet.3.2.0.js:1
pump_message    @   dotnet.3.2.0.js:1
setTimeout (async)      
_schedule_background_exec   @   dotnet.3.2.0.js:1
mono_threads_schedule_background_job    @   00755c3a:0x14dbd
ves_icall_System_Threading_ThreadPool_RequestWorkerThread   @   00755c3a:0xa0025
ves_icall_System_Threading_ThreadPool_RequestWorkerThread_raw   @   00755c3a:0x9fecf
do_icall    @   00755c3a:0x10f790
do_icall_wrapper    @   00755c3a:0x50b6a
interp_exec_method  @   00755c3a:0x2588e
interp_runtime_invoke   @   00755c3a:0xf7391
mono_jit_runtime_invoke @   00755c3a:0xddb3d
do_runtime_invoke   @   00755c3a:0x3ba85
mono_runtime_try_invoke @   00755c3a:0xcfdb
mono_runtime_invoke @   00755c3a:0x44b39
mono_wasm_invoke_method @   00755c3a:0xca6a7
Module._mono_wasm_invoke_method @   dotnet.3.2.0.js:1
call_method @   dotnet.3.2.0.js:1
(anonymous) @   dotnet.3.2.0.js:1
endInvokeJSFromDotNet   @   blazor.webassembly.js:1
(anonymous) @   blazor.webassembly.js:1
Promise.then (async)        
beginInvokeJSFromDotNet @   blazor.webassembly.js:1
_mono_wasm_invoke_js_marshalled @   dotnet.3.2.0.js:1
do_icall    @   00755c3a:0x10f8b1
do_icall_wrapper    @   00755c3a:0x50b6a
interp_exec_method  @   00755c3a:0x2588e
interp_runtime_invoke   @   00755c3a:0xf7391
mono_jit_runtime_invoke @   00755c3a:0xddb3d
do_runtime_invoke   @   00755c3a:0x3ba85
mono_runtime_invoke_checked @   00755c3a:0x96a2
mono_runtime_try_invoke_array   @   00755c3a:0x66c26
ves_icall_InternalInvoke    @   00755c3a:0xb44ff
ves_icall_InternalInvoke_raw    @   00755c3a:0xb3ffd
do_icall    @   00755c3a:0x10f8b1
do_icall_wrapper    @   00755c3a:0x50b6a
interp_exec_method  @   00755c3a:0x2588e
interp_runtime_invoke   @   00755c3a:0xf7391
mono_jit_runtime_invoke @   00755c3a:0xddb3d
do_runtime_invoke   @   00755c3a:0x3ba85
mono_runtime_try_invoke @   00755c3a:0xcfdb
mono_runtime_invoke @   00755c3a:0x44b39
mono_wasm_invoke_method @   00755c3a:0xca6a7
Module._mono_wasm_invoke_method @   dotnet.3.2.0.js:1
call_method @   dotnet.3.2.0.js:1
(anonymous) @   dotnet.3.2.0.js:1
beginInvokeDotNetFromJS @   blazor.webassembly.js:1
s   @   blazor.webassembly.js:1
e.invokeMethodAsync @   blazor.webassembly.js:1
(anonymous) @   blazor.webassembly.js:1
t.dispatchEvent @   blazor.webassembly.js:1
(anonymous) @   blazor.webassembly.js:1
(anonymous) @   blazor.webassembly.js:1
e.onGlobalEvent @   blazor.webassembly.js:1

请告知我需要做哪些进一步的测试来确定问题所在,以及如何解决。

编辑和更新

根据下面的答案之一,我转而使用PutObjectRequest。代码如下。现在出现了一个新错误,我认为这与 S3 存储桶的权限有关。谁能指导我需要改变什么?

Code

public class UploadData
{
    private readonly BasicAWSCredentials credentials = new BasicAWSCredentials("access key", "secret Key");

    public async Task UploadZipFile(Stream zip_file, string file_name)
    {
        zip_file.Seek(0, SeekOrigin.Begin);
        var config = new AmazonS3Config
        {
            RegionEndpoint = Amazon.RegionEndpoint.EUWest2
        };
        using var client = new AmazonS3Client(credentials, config);

        var putRequest1 = new PutObjectRequest
        {
            BucketName = "Bucket_name",
            Key = file_name,
            InputStream = zip_file
        };
        PutObjectResponse response1 = await client.PutObjectAsync(putRequest1);

        Console.WriteLine("finshed uploading");
    }
}

这是错误代码

Unknown encountered on server. Message:'TypeError: Failed to execute 'append' on 'Headers': Invalid value' when putting an object

我对 Blazor 和 WebAssembly 不太了解,但我可以尝试并给你一个我会尝试的建议:

  1. 上面代码中的问题似乎是 WebAssembly 中缺乏多线程支持,另请参阅 [1]。
  2. The 传输工具aws-sdk-net 中的类使用线程进行分段上传,请参阅 [2]:

TransferUtility 提供了一个简单的 API,用于将内容上传到 Amazon S3 以及从 Amazon S3 下载内容。它广泛使用 Amazon S3 分段上传来提高吞吐量、性能和可靠性。

通过指定文件路径而不是流来上传大文件时,TransferUtility 使用多个线程一次上传单个上传的多个部分。当处理大内容和高带宽时,这可以显着提高吞吐量。

因此,我会尝试使用一些低级构造来完成标准上传放置对象请求, see: https://docs.aws.amazon.com/AmazonS3/latest/userguide/upload-objects.html https://docs.aws.amazon.com/AmazonS3/latest/userguide/upload-objects.html

如果要上传的文件不太大,这应该没有任何问题,因为它是单线程方法。

另一个问题是在 Blazor WASM 中启用多线程,但我不确定这是否已经是一个选项,请参阅 [3]。

[1] https://www.meziantou.net/don-t-freeze-ui-while-executing-cpu-intense-work-in-blazor-web assembly.htm https://www.meziantou.net/don-t-freeze-ui-while-executing-cpu-intensive-work-in-blazor-webassembly.htm
[2] https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/S3/TTransferUtility.html https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/S3/TTransferUtility.html
[3] https://github.com/dotnet/aspnetcore/issues/17730 https://github.com/dotnet/aspnetcore/issues/17730

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 zip 从 Blazor WASM 应用程序上传到 AWS-S3 - 遵循教程,没有观察到错误,但存储桶中也没有文件 的相关文章

  • 如何使用 blazor 前端 http 请求附加令牌

    我使用 blazor 作为前端 api 已完成 JWT 配置 前端可以创建用户帐户并登录API 但现在我的前端httpclient没有设置JWT令牌 所以如果我在Api控制器中设置 授权 前端将无法访问它 api程序代码如下 builder
  • 从 Docker 容器中获取 AWS 实例元数据?

    是否有一种直接的方法可以从 Docker 容器内访问 AWS 实例元数据 例如 当尝试在 EC2 实例上获取 IAM 角色的凭证时 这将适用于实例本身 http 169 254 169 254 latest meta data iam se
  • generate_series() 方法在 Redshift 中失败

    当我运行 SQL 查询时 select generate series 0 g from select date date1 date date2 as g from mytable 它返回一个错误 INFO Function genera
  • AWS CloudSearch:1 个域中的不同文档?

    我有兴趣在我的 Web 应用程序中使用 AWS Cloud Search 我想要将 3 种不同的文档类型设为可搜索 用户 文章 图像 使用 Cloud Search 执行此操作的最佳方法是什么 我需要创建 3 个不同的 AWS 搜索域吗 这
  • AWS S3 JavaScript SDK - 网络错误:网络故障

    我正在尝试使用 AWS 在浏览器网页的示例中提供的示例 并且我不断收到NetworkingError Network Failure错误 这是我正在使用的
  • 从 RabbitMQ 迁移到 Amazon SQS [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们的初创公司目前正在使用RabbitMQ with Python Django 对于消息队列 现在我们计划转移到Amazon SQS其高可用性
  • 我可以指定默认的 AWS 配置文件吗?

    在我的开发环境中 我经常在多个 AWS 访问密钥之间切换 所以在我的 aws credentials文件 我有几个配置文件 然后 我可以通过指定以下内容将这些配置文件与 aws cli 一起使用 profile
  • 如何使用 AWS SAM 为 HttpApi 配置自定义域?

    我正在使用 AWS Lambda AWS API Gateway 和 aws sam 开发 API 我已经实现了 firebase 身份验证 我也使用嵌套堆栈 我正在尝试为我的 API 端点使用自定义域 因此我可以像这样调用api mydo
  • AWS DynamoDb DocumentClient - 从项目数组创建批量写入 - node.js

    我正在尝试执行batchWrite使用 DynamoDB 的操作DocumentClient来自项目数组 JSON 这是我的代码 var items for i 0 i lt orders length i var ord orders i
  • 在哪里可以找到 AWS Amplify Logger 日志

    我目前正在开发一个使用 AWS Amplify 创建的 Web 应用程序 我必须在其中实现日志记录 基于AWS 放大文档 https docs amplify aws lib utilities logger q platform js有一
  • CORS 击败 AWS LAMBDA :(

    我读了很多关于 CORS Lambda AWS API Gateway 配置的文章 包括 AWS 的设置帮助 http docs aws amazon com apigateway latest developerguide how to
  • ECS 上蓝/绿部署所需的 Cloudformation 脚本

    我正在尝试编写一个云形成模板具有蓝绿部署支持的 AWS ECS 这项蓝绿功能最近由 AWS 在 ECS 中添加 但在云形成模板中找不到任何更新它的参考 他们提供了有关如何通过 UI 而不是通过云形成来完成此操作的文档 我猜想 AWS 可能不
  • AWS CodeBuild - 如何跳过构建

    我的构建是在每次推送到存储库和每次拉取请求时触发的 因此 CODEBUILD SOURCE VERSION 看起来像 pr 8 或 4570d2e7158cfef687af8da31d1ffec7b02e5ca3 我只希望为 pr 分支执行
  • 如何计算 OpenID Connect 服务器的指纹?

    创建 OpenID Connect 提供商 例如 AWS 时 我需要指定一个指纹对于连接器 它是什么 我如何获得它 例如 从如何在不使用密钥的情况下将 GitHub 操作与 AWS 部署连接起来 https stackoverflow co
  • 如何从本地模式下运行的 pyspark 中的 S3 读取数据?

    我正在使用 PyCharm 2018 1 使用 Python 3 4 并通过 virtualenv 中的 pip 安装 Spark 2 3 本地主机上没有安装hadoop 因此没有安装Spark 因此没有SPARK HOME HADOOP
  • AWS 获取带有自定义域的预签名 URL

    以下是我正在做的事情 我正在使用自定义域为我的非公开 s3 存储桶资源生成预签名 URL 另外 为了添加证书 我为具有以下原始设置的存储桶创建了一个 Cloudfront 发行版 源域名 bucket name s3 amazonaws c
  • 将带有 html 标签的纯文本转换为 html 字符串并在 Blazor 中呈现

    Sample var s p Sample text p 期待 Sample text 我希望它在浏览器上呈现 但我无法呈现它 它只是将 s 的整个值作为文本字符串输出 我已经尝试过 new HtmlString s 将其编码为HttpUt
  • AWS CloudWatchLog 限制

    我正在尝试找到集中式解决方案来将我的应用程序日志记录从数据库 RDS 中移出 我本想使用 CloudWatchLog 但注意到 PutLogEvents 请求有限制 PutLogEvents 请求的最大速率为每秒 5 个请求 每个日志流 即
  • S3 的 Rails 回形针默认图像

    我尝试在应用程序中使用default url 但我使用S3 存储图像 我不确定我需要在那里输入什么 URL 或者我是否必须创建一个假图像才能将所有内容放在那里 由于我的图像总是通过 S3 渲染 所以我不知道如果我只是在公共文件夹中放入一些默
  • 将 Blazor Webassemble 项目包含到现有 ASP.NET Core 项目中

    创建新的 Blazor Web assembly 项目时 有一个复选框ASP NET Core hosted https learn microsoft com en us aspnet core blazor host and deplo

随机推荐