AWS S3 读取流的问题

摘要:
由于业务原因,您需要将两个MongoDB表的数据切换到AWS的S3,然后在切换过程中找到以下代码:;首先删除整个TempFiles目录,将流写入特定文件,然后将其读出;尝试修改后,认为前者是为了解决AWS获得的流无法直接获取的问题。然而,将存在并发问题。

因为业务,需要将两张MongoDB 表的数据切换到 AWS 的S3中,再切换中发现下面的代码;先删除整个TempFiles 目录,将流写到特定文件中,然后再读出来; 通过尝试修改,认为前人是为了解决AWS 获取的流是不能直接拿来,才这么处理的。但是这样处理会有并发问题。

var request = new GetObjectRequest
{
	BucketName = bucket.StartsWith(BucketPrefix) ? bucket : BucketPrefix + bucket,
	Key = key
};

var tempDirectory = AppDomain.CurrentDomain.BaseDirectory + "/App_Data/TempFiles/";

if (Directory.Exists(tempDirectory))
{
	var tempFiles = Directory.GetFiles(tempDirectory);
	foreach (var tempFile in tempFiles)
	{
		try
		{
			if (File.Exists(tempFile))
			{
				File.Delete(tempFile);
			}
		}
		catch (Exception ex)
		{
			Logger.Debug($"Can't delete temp file {tempFile}. Eception={ex.Message}");
		}
	}
}

using (GetObjectResponse response = await Client.GetObjectAsync(request).ConfigureAwait(false))
{
	// the response stream from amazon is encrypt, so wo have to write stream to a temp file.
	var tempFilePath = Path.Combine(tempDirectory + Guid.NewGuid());
	response.WriteResponseStreamToFileAsync(tempFilePath, append: false, CancellationToken.None).GetAwaiter().GetResult();
	var fileName = response.Metadata["x-amz-meta-title"];

	return new ReadFileAsyncResult
	{
		FileStream = new FileStream(tempFilePath, FileMode.Open, FileAccess.Read, FileShare.Read),
		FileName = fileName
	};
}

  

通过求教 获取了一个新的方法


var
request = new GetObjectRequest { BucketName = bucket.StartsWith(BucketPrefix) ? bucket : BucketPrefix + bucket, Key = key }; using (GetObjectResponse response = await Client.GetObjectAsync(request).ConfigureAwait(false)) { var fileName = response.Metadata["x-amz-meta-title"]; var memoryStream = new MemoryStream(); response.ResponseStream.CopyTo(memoryStream); memoryStream.Position = 0; return new ReadFileAsyncResult { FileStream = memoryStream, FileName = fileName };
}

免责声明:文章转载自《AWS S3 读取流的问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇redis-缓存设计-记录前一个小时和最新的日志【Tools】Ubuntu20.04安装VMware Tools详解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

[AWS] AWS

The AWS Command Line Interface (AWS CLI) is a command-line tool that allows you to interact with AWS services using commands in your terminal/command prompt. AWS CLI enables you...

使用 minio 搭建私有对象存储云。aws-php-sdk 操作object

How to use AWS SDK for PHP with Minio Server aws-sdk-php is the official AWS SDK for the PHP programming language. In this recipe we will learn how to use aws-sdk-php with Minio s...

利用S3fs在Amazon EC2 Linux实例上挂载S3存储桶

一、准备!!! 1、使用拥有足够权限的IAM账号登录AWS控制台 2、创建S3存储桶,给存储桶命名如“my-bucket”(如果使用已有存储桶,本步骤可略过) 3、有该S3存储桶访问权限的 IAM 用户,并为该IAM用户创建访问密钥 关于如何创建IAM用户,请参见:http://docs.aws.amazon.com/zh_cn/IAM/latest/U...

aws 负载均衡ELB访问后端私有子网中的服务(Private subnet)

常见Web系统的网络架构:  这个架构涉及几个问题: 1. 如何将面向公众的负载均衡器连接到具有私有 IP 地址的 EC2 实例 2.在私有实例中如何访问互联网的服务(比如第三方的接口)等 重要的两个概念: 公有子网 如果子网的默认流量路由到互联网网关,则该子网称为公有子网。例如,如果在此子网中启动的实例具有弹性 IP 地址或与之关联的公有 IP 地址,...

AWS上的游戏服务:Lumberyard + Amazon GameLift + Twitch

      开发一款世界级的游戏是一个非常困难,耗时和昂贵的过程。如今的游戏玩家要求越来越苛刻,他们希望既能够通过各种不同的终端设备来进行游戏 ,又要求游戏具有社交的功能。因为此类游戏的开发期和推广期都非常长。因此在游戏公布当天会有成千上万的用户同一时候挤进server进行游戏体验,往往在这一时刻就决定了该游戏的成败 。       为了应对这一挑战,游...

汽车网络处理设计

汽车网络处理设计 适用于中央网关、域控制器、FOTA、安全密钥管理、智能天线和高性能中央计算节点 概述 恩智浦S32G-VNP-RDB2是一款紧凑型、高度优化的集成板,适用于汽车服务型网关(SoG)、域控制应用、高性能处理、功能安全和信息安全应用。 S32G-VNP-RDB2基于4个Arm® Cortex®-A53内核和3个双核锁步Arm Cortex-M...