天道酬勤,学无止境

In a C# .NET web application, can I download an Amazon S3 object directly into memory and serve it as an image?

With the AWS .NET SDK, can I download an S3 Object (a .jpg image file) directly into memory? I'm sure I saw a solution to this floating around a few months ago, but can't find it now.

Assuming I can download the file directly into memory, can I then serve the image to the client using a

context.Response.Write(memoryStream object);

Thanks for your help. I know you're probably thinking, why would you do this? Why not just link to the file directly? It's a complex reason, I'm just trying to keep it simple for the time being. Cheers!

评论

You can certainly get data from another source and load it into memory, but you have to fetch the data somehow.

Most likely that will be in the form of a web fetch. You could very easily go get the data using an HttpWebRequest to the URL of the S3 object, read the data into a memory stream, and then write the data into your response stream. I would recommend you skip the memory stream step and do a buffered read from your S3 fetch response and write to your ASP.NET response.

There are caveats to this approach. First, you'll have to solve security if your S3 object isn't publicly accessible. Second, your initial ASP.NET request will pause while you are fetching this data, which will increase the latency for getting the image to the browser that could easily be fixed by simply linking to the object.

For example:

// Assuming url is the  url to the S3 object.
var buffer = new byte[1024*8]; // 8k buffer. 
var request = (HttpWebRequest)WebRequest.Create(url);
var response = request.GetResponse();
int bytesRead = 0;
using (var responseStream = response.GetResponseStream())
{
    while((bytesRead = responseStream.Read(buffer, 0, buffer.Length)) != 0)
    {
         Response.OutputStream.Write(buffer, 0, bytesRead);
    }
}

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 您如何搜索亚马逊S3铲斗?(How do you search an amazon s3 bucket?)
    问题 我的存储桶中有成千上万个文件。 如何搜寻水桶? 有没有可以推荐的工具? 回答1 S3没有本机的“搜索此存储区”,因为实际内容是未知的-而且,由于S3是基于键/值的,因此无法立即使用本机方式访问许多节点以及提供(SELECT * FROM ... WHERE ...) (在SQL模型中)。 您需要执行的是执行ListBucket以获取存储桶中的对象列表,然后遍历执行您实现的自定义操作(即搜索)的每个项目。 回答2 只需在此处添加一条便条:现在已经3年了,但是当您键入“如何搜索S3存储桶”时,这篇文章在Google中排名第一。 也许您正在寻找更复杂的东西,但是如果您试图通过标题找到一个简单的对象(文件),那么这很简单: 打开存储桶,在右侧选择“无”,然后开始输入文件名。 http://docs.aws.amazon.com/AmazonS3/latest/UG/ListingObjectsinaBucket.html 回答3 这是使用AWS CLI来搜索文件名的一种简短而丑陋的方法: aws s3 ls s3://your-bucket --recursive | grep your-search | cut -c 32- 回答4 (至少)有两种不同的用例,它们可以描述为“搜索存储桶”: 在存储在存储桶中的每个对象中搜索内容; 这假定该存储桶中的所有对象(例如文本文件
  • Streaming Amazon S3 Objects From a Web Server Using Laravel
    In my web-application built using laravel 5.1, users can upload some sensitive files that I store in Amazon S3. Later I want users WITH PERMISSION to download this file. Since I want this auth check in place, I cannot download the file using traditional methods by giving them direct link to file in S3. My approach: When user requests a download, my servers download the file locally and then stream to user. Issue: Takes long time because files are too large sometimes. Give the user a pre-signed URL to download directly from S3. URL is only valid for 5 minutes. Issue: If that URL is shared
  • 使用 API 以编程方式在 amazon S3 和 Glacier 之间移动文件,反之亦然(Move files between amazon S3 to Glacier and vice versa programmatically using API)
    问题 我正在使用 Amazon 的 S3 和冰川服务创建一个基于 PHP 的 Web 应用程序。 现在我想为我的站点用户提供一个功能,他们可以选择任何文件并将其存档(意味着将文件从 S3 移动到 Glacier)和取消存档(意味着将文件从 Glacier 移动到 S3)。 我做了一些研究,但没有找到任何使用亚马逊 API 的可能方法。 问题 如何使用 API 在 S3 和 Glacier 之间移动文件? 回答1 您可以使用 Glacier API 将文件上传到 Glacier 保险库,但我不建议这样做。 我们备份应用程序的先前版本就是这样做的。 当您上传文件时,它会获得一个随机分配的名称。 您可以将您的文件名添加到文件的元数据中,但如果您想要 Glacier 保险库中的内容列表,您必须查询,然后等待 3-5 小时才能获得该列表。 生命周期策略是使用 Glacier 的另一种方式。 当前版本的 Arq 使用它们是因为每个对象看起来仍然像一个 S3 对象(没有随机的对象名称,获取对象列表没有延迟),但对象内容在 Glacier 存储中。 唯一的区别是获取对象内容是一个两步过程:您必须进行 API 调用以请求使对象可下载; 准备好后,您可以下载它。 此外,如果您请求以过快的速度下载对象,则会产生“每小时高峰请求费”。 Amazon Glacier 定价很复杂。 一旦对象是“冰川存储类”
  • 如何使用C#将文件上传到Amazon S3 super easy(How to upload a file to amazon S3 super easy using c#)
    问题 我对所有这些不起作用的“上载至S3”示例和教程感到厌倦,有人可以向我展示一个简单但可以轻松实现的示例吗? 回答1 好了,这里是您要获得完全正常运行的演示程序所必须遵循的说明... 1-下载并安装适用于.NET的Amazon Web服务SDK,您可以在(http://aws.amazon.com/sdk-for-net/)中找到该SDK。 因为我有Visual Studio 2010,所以我选择安装3.5 .NET SDK。 2-打开Visual Studio并创建一个新项目,我有Visual Studio 2010,并且我正在使用控制台应用程序项目。 3-添加对AWSSDK.dll的引用,它与上述Amazon Web Service SDK一起安装,在我的系统中,该dll位于“ C:\ Program Files(x86)\ AWS SDK for .NET \ bin \ Net35 \ AWSSDK .dll”。 4-创建一个新的类文件,在此处将其的完整代码称为“ AmazonUploader”: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Amazon; using Amazon.S3; using Amazon.S3
  • Amazon S3更改文件下载名称(Amazon S3 Change file download name)
    问题 我将文件存储在S3上,并使用GUID作为键名。 我正在使用预先签名的URL按照S3 REST API进行下载 我将原始文件名存储在自己的数据库中。 当用户单击以从我的Web应用程序下载文件时,我想返回其原始文件名,但是目前他们所获得的只是一个GUID 。 我怎样才能做到这一点? 我的Web应用程序位于salesforce中,因此我没有太多控制权来执行响应。由于调控器的限制,所有文件都重定向到Web服务器,然后将其重命名。 是否可以使用一些HTML重定向,元刷新,Javascript? 有什么方法可以更改S3的下载文件名(我唯一想到的就是将对象更改为新名称,然后下载并删除)。 我想避免为每个用户创建存储桶,因为我们会有很多用户,但仍然不能保证每个存储桶中的每个文件都具有唯一的名称 还有其他解决方案吗? 回答1 我想您的十字架在Amazon S3论坛上发布了这个问题,但是为了其他人,我想在这里发布答案: 如果每个S3对象只有一个“用户文件名”,则可以在s3文件上设置Content-Disposition标头以设置下载文件名:Content-Disposition:附件; filename = foo.bar 为了公平起见,我想提一下,在亚马逊论坛上提供正确的答案不是我本人,所有荣誉应归因于Colin Rhodes ;-) 回答2 虽然公认的答案是正确的
  • 使用 Laravel 从 Web 服务器流式传输 Amazon S3 对象(Streaming Amazon S3 Objects From a Web Server Using Laravel)
    问题 在我使用 laravel 5.1 构建的 Web 应用程序中,用户可以上传我存储在 Amazon S3 中的一些敏感文件。 后来我想有权限下载此文件的用户。 由于我希望进行此身份验证检查,因此我无法通过为 S3 中的文件提供直接链接来使用传统方法下载文件。 我的做法: 当用户请求下载时,我的服务器会在本地下载文件,然后流式传输给用户。 问题:需要很长时间,因为有时文件太大。 为用户提供一个预签名的 URL 以直接从 S3 下载。 URL 仅在 5 分钟内有效。 问题:如果该 URL 被共享,任何人都可以在 5 分钟内下载它。 根据本文,将数据直接从 S3 流式传输到客户端。 这看起来很有希望,但我不知道如何实现这一点。 根据这篇文章,我需要: 注册流包装器——这是我的第一个问题,因为我不知道如何获取S3Client对象,因为 laravel 使用 flysystem,而且我不知道调用什么方法来获取这个对象。 也许我需要在我的 composer.json 中单独包含 S3 包? 禁用输出缓冲 -我需要在 laravel 中执行此操作还是 laravel 已经处理过它? 我相信其他开发人员以前也遇到过这样的问题,并希望得到一些帮助指点。 如果有人已经使用 laravel Response::download($pathToFile, $name, $headers)直接从 S3
  • Spring Boot Amazon AWS S3存储桶文件下载-访问被拒绝(Spring Boot Amazon AWS S3 Bucket File Download - Access Denied)
    问题 我有一个自动配置的AWS,Spring Boot应用程序,并且我试图设置一个端点,该端点将简单地从Amazon S3中的给定存储桶下载特定文件。 我使用AWS控制台从计算机将JPEG文件上传到存储桶中-现在我正尝试使用Spring Boot API下载该文件。 我收到以下错误: com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; 我已经在AWS控制台上创建了一个用户和一个组(该组中的用户); 用户/组具有对S3的完全访问权限以及管理员访问权限。 我下载了access-key / secret-key对,并且出于测试目的,将这些字面值按如下所示粘贴到了我的application.properties文件中(显然这里没有显示键:))。 我对为何仍然无法访问拒绝感到困惑。 我已经搜索和处理了一段时间; 我似乎找不到特定于Spring Boot的解决方案。 任何帮助将不胜感激。 application.properties: cloud.aws.credentials.accessKey=myaccesskey cloud.aws.credentials.secretKey
  • 如何从命令行访问Amazon S3上的文件?(How to access a file on Amazon S3 from the Command Line?)
    问题 问题: 是否有直接从命令行访问存储在Amazon S3上的数据文件的简单方法? 动机: 我松散地关注在线教程,作者在其中链接到以下URL: s3://bml-data/churn-bigml-80.csv 这是一个简单的csv文件,但无法使用Web浏览器或curl来打开它。 本教程使用BigML打开它,但是我想自己下载数据。 一些谷歌搜索告诉我,有许多专为S3访问而设计的python和Scala库...但是直接打开或下载文件真的很好。 我使用Mac,并且是家庭酿酒的忠实拥护者,因此(对我而言)完美的解决方案将在此系统上运行。 奖励问题: 有什么好方法可以查看Amazon E3存储桶(我不拥有)的内容? 该文件的性质(特定数据集的80%)使我怀疑可能是一个churn-bigml-20.csv文件隐藏在那里。 我的自动方法是尝试卷曲/打开期望的文件...第一个问题的解决方案将使我能够以一种丑陋的方式检查这种预感。 如果有人知道远程浏览特定S3存储桶中内容的方法,那将非常有用。 再次,探索google和SO告诉我,有针对此的库,但是更直接的方法将很有用。 回答1 AWS命令行界面(CLI)是用于管理AWS服务的统一工具,包括访问存储在Amazon S3中的数据。 AWS Command Line Interface适用于Windows, Mac和Linux。
  • How can I protect my AWS access id and secret key in my python application
    I'm making an application in Python and using Amazon Web Services in some modules. I'm now hard coding my AWS access id and secret key in *.py file. Or might move them out to an configuration file in future. But there's a problem, how can I protect AWS information form other people? As I know python is a language that easy to de-compile. Is there a way to do this? Well what I'm making is an app to help user upload/download stuff from cloud. I'm using Amazon S3 as cloud storage. As I know Dropbox also using S3 so I'm wondering how they protects the key. After a day's research I found something
  • Amazon S3, Syncing, Modified date vs. Uploaded Date
    We're using the AWS SDK for .NET and I'm trying to pinpoint where we seem to be having a sync problem with our consumer applications. Basically we have a push-service that generates changeset files that get uploaded to S3, and our consumer applications are supposed to download these files and apply them in order to sync up to the correct state, which is not happening. There's some conflicting views on what/where the correct datestamps are represented. Our consumers were written to look at the s3 file's "LastModified" field to sort the downloaded files for processing, and I don't know anymore
  • 如何将大于 5 MB(大约)的文件上传到 Amazon S3(官方 SDK)?(How to upload files to Amazon S3 (official SDK) that are larger than 5 MB (approx)?)
    问题 我正在使用官方 Amazon S3 SDK (1.0.14.1) 的最新版本来创建备份工具。 到目前为止,如果我上传的文件大小低于 5 MB,一切正常,但当任何文件高于 5 MB 时,上传失败,但出现以下异常: System.Net.WebException:请求被中止:请求被取消。 ---> System.IO.IOException:在写入所有字节之前无法关闭流。 在 System.Net.ConnectStream.CloseInternal(Boolean internalCall, Boolean aborting) --- 内部异常堆栈跟踪结束 --- 在 Amazon.S3.AmazonS3Client.ProcessRequestError(String actionName, HttpWebRequest request, WebException we, HttpWebResponse errorResponse, String requestAddr , WebHeaderCollection& respHdrs, Type t) at Amazon.S3.AmazonS3Client.Invoke[T](S3Request userRequest) at Amazon.S3.AmazonS3Client.PutObject
  • Forcing Download from s3 amazon servers
    I've been developing a new web application which relies on Amazon S3 servers as storage system, and Codeiginter as the PHP framework. I need to force the file to download when the link is clicked. The original URL looks like this: http://www.our-web.com/download/do/1.jpg which generates a temporary signed URL to the actual file on the Amazon S3 servers like this: http://main_bucket.s3.amazonaws.com/post/1/1.jpg?AWSAccessKeyId=AKIAJEOQKYPKC3CCU5RA&Expires=1305395426&Signature=iuzCdA22gImLK192%2BMAhk8OkAY8%3D I need to make the file start downloading from the real Amazon URL it soon as the user
  • 允许第三方用户将文件上传到您的AWS S3 fs中(Allowing third party users to upload files into your AWS S3 fs [closed])
    问题 关门了。 这个问题需要更加集中。 它当前不接受答案。 想要改善这个问题吗? 更新问题,使其仅通过编辑此帖子即可将重点放在一个问题上。 3年前关闭。 改善这个问题 我这里有一个非常棘手的问题:我需要允许网站的用户将非常大的文件上传到他们的账户,并且我想将这些文件存储在AWS S3文件系统上。 我不能只是编写一个Web服务来接收它们并将它们保存在S3 fs中,因为在上传过程中各种事情都可能出错,并且我需要一个复杂的上载器客户端。 Amazon提供的那种将文件上传到S3的客户端,但是我当然不能让用户直接访问它。 我对此表示衷心的感谢! 谢谢 回答1 最佳实践是让您的客户端应用程序直接上传到S3,而不要通过您自己的Web基础结构。 这将利用S3的以太大规模并行特性,并减轻Web基础架构的负担。 卸载基础架构将允许使用较少的实例或较小的实例来提供相同数量的流量。 因此,您的基础设施成本更低。 您将需要编写一个S3 IAM策略,以限制每个用户对S3上自己的“目录”(也称为键前缀)的访问 看一下这个博客文章:http://blogs.aws.amazon.com/security/post/Tx1P2T3LFXXCNB5/Writing-IAM-policies-Grant-access-to-user-specific-folders-in-an-Amazon- S3扣
  • 如何从远程服务器直接将文件上传到Amazon S3?(How to upload files directly to Amazon S3 from a remote server?)
    问题 是否可以从远程服务器将文件上传到S3? 远程服务器基本上是基于URL的文件服务器。 例如,使用http://example.com/1.jpg提供图片。 它没有执行任何其他操作,因此无法在此服务器上运行代码。 可能有另一个服务器告诉S3从http://example.com/1.jpg上传文件 upload from http://example.com/1.jpg server -------------------------------------------> S3 <-----> example.com 回答1 如果您不能在服务器上运行代码或执行请求,那么不能,您不能这样做。 您必须将文件下载到您拥有的服务器或计算机上,然后从那里上传。 您可以在http://docs.amazonwebservices.com/AmazonS3/latest/API/APIRest.html上查看可以在Amazon S3上执行的操作。 检查REST和SOAP API的操作,您将看到无法为Amazon S3提供远程URL并让它为您获取对象。 所有PUT请求都要求将对象的数据作为请求的一部分提供。 意味着正在启动Web请求的服务器或计算机需要具有数据。 过去,我曾有一个类似的问题,我想下载用户的Facebook缩略图并将其上传到S3以便在我的网站上使用。
  • 如何在 Autoscaled(多实例)Elastic Beanstalk (Tomcat) 应用程序 (AWS) 中配置数据文件?(How do I configure data files in a Autoscaled (multi-instance) Elastic Beanstalk (Tomcat) Application (AWS)?)
    问题 我目前有一个运行部署到 Tomcat 的 Java 应用程序的 Elastic Beanstalk 实例。 我使用 Web 界面部署应用程序,但应用程序使用 web.xml 中引用的数据文件(Lucene 索引),我通过 ssh-ing 到 EC2 并从我的 S3 存储桶获取数据文件将其复制到底层 EC2 实例。 到现在为止还挺好。 但是,如果我将 EB 更改为可自动扩展的环境,以便它根据需要自动创建新实例,那么这些 EC2 实例将没有数据文件,我该如何处理。 我可以在实际使用之前使用数据文件预先配置每个 EC2 实例吗? 我可以有一个每个服务器都可以引用的共享文件系统吗(数据文件是只读的)? * 更新 * 我想我已经在原则上找到了答案。 我从本地机器上传我的应用程序,然后从亚马逊添加大型数据文件。 我需要做的是在我的数据处理 EC2 实例上构建我的战争,将数据文件添加到战争的某个地方,然后将此战争放到 S3 上,然后当我创建我的 EB 时,我需要从 S3 存储桶加载 WAR。 所以只需要弄清楚数据文件在 War 中的位置以及如何通过 Maven 构建过程创建。 * 更新 2 * 实际上不清楚数据文件到底应该放在 WAR 文件中,我看不到把它们放在哪里,应用程序希望它们是真实的文件,所以如果包含在 WAR 中并且 WAR 没有被扩展/解压(我不知道EB)
  • Amazon S3,同步,修改日期与上传日期(Amazon S3, Syncing, Modified date vs. Uploaded Date)
    问题 我们正在使用适用于 .NET 的 AWS 开发工具包,我正在尝试查明我们的消费者应用程序似乎存在同步问题的地方。 基本上,我们有一个推送服务,可以生成上传到 S3 的变更集文件,我们的消费者应用程序应该下载这些文件并应用它们,以便同步到正确的状态,但这种情况并没有发生。 关于代表正确日期戳的内容/位置存在一些相互矛盾的观点。 我们的消费者被写入查看 s3 文件的“LastModified”字段以对下载的文件进行排序以进行处理,我不再知道该字段代表什么。 起初我认为它代表了我们上传的文件的修改/创建日期,然后(如此处所见)它实际上代表了文件上传时间的新日期戳,同样在同一个链接中,它似乎暗示当下载文件后,它会恢复到旧的日期戳(但我无法确认这一点)。 我们正在使用这段代码来拉取文件 // Get a list of the latest changesets since the last successful full update. Amazon.S3.AmazonS3Client client = ...; List<Amazon.S3.Model.S3Object> listObjects = client.GetFullObjectList( this.Settings.GetS3ListObjectsRequest(this.Settings
  • 尝试生成预先签名的 url 链接,以便用户可以下载 Amazon S3 对象,但收到无效请求(Trying to generate a presigned url link so an user can download an Amazon S3 object, but getting invalid request)
    问题 我目前正在使用带有服务器端客户提供的加密密钥 (SSE-C) 的 Ruby aws-sdk 版本 2 gem。 我可以毫无问题地将对象从 rails 表单上传到 Amazon S3。 def s3 Aws::S3::Object.new( bucket_name: ENV['S3_BUCKET'], key: 'hello', ) end def upload_object customer_key = OpenSSL::Cipher::AES.new(256, :CBC).random_key customer_key_md5 = Digest::MD5.new.digest(customer_key) object_key = 'hello' options = {} options[:key] = object_key options[:sse_customer_algorithm] = 'AES256' options[:sse_customer_key] = customer_key options[:sse_customer_key_md5] = customer_key_md5 options[:body] = 'hello world' options[:bucket] = ENV['S3_BUCKET'] s3.put(options) test
  • Is it safe to return an ResponseEntity<InputStreamResource> that wraps S3Object.getObjectContent() in REST controller?
    I'm developing an Spring Boot Application, that should allow users to download files indirectly from Amazon S3 via specified application REST interface. For this purpose I have an REST-Controller, that returns an InputStreamResource to the user like following: @GetMapping(path = "/download/{fileId}") public ResponseEntity<InputStreamResource> downloadFileById(@PathVariable("fileId") Integer fileId) { Optional<LocalizedFile> fileForDownload = fileService.getConcreteFileForDownload(fileId); if (!fileForDownload.isPresent()) { return ResponseEntity.notFound().build(); } return ResponseEntity.ok()
  • Amazon S3 TransferUtility.Upload hangs in C#
    So I'm writing a migration application, to take some data from our local storage and upload it to Amazon. Everything is working fine, except once I get into files that are greater than 15 megs (megs, yes, NOT Gigs), the application freeze. This is in C#, pretty straightforward. var transferRequest = new TransferUtilityUploadRequest { Key = firstKey, FilePath = fileName, BucketName = ContentBucket, Timeout = 3600000, ContentType = GetContentTypeForFileExtension(fileName) }; transferRequest.UploadProgressEvent += DisplayFileProgress; transferUtil.Upload(transferRequest); Like I said, works just
  • 如何在EC2 Windows实例中以编程方式/远程执行程序(How to programmatically/remotely execute a program in EC2 Windows instance)
    问题 我想启动一个EC2 Windows实例,上传一个可执行文件并执行它(所有操作都是自动化的,这很重要) 到目前为止,我已经能够以编程方式启动EC2 Windows实例并获取其参数(密码/ IP),现在我想找到一种方法(从Windows机器或其他EC2 linux实例上载此可执行文件)并运行它。 我曾考虑过启动RDP连接并使用宏软件上载并执行文件,但是根据以往的经验,至少可以这样说,这是一种较差/脆弱的方法。 我还考虑过将此EXE上传到服务器,然后在Windows上执行以下操作: wget http://www.domain.com/my-file.exe 除了Windows没有wget! 所以我的问题是:有没有办法在EC2 Windows实例中以编程方式上传和执行EXEcutable? 回答1 命令ec2-run-instances具有两个附加参数,可在运行该命令时使用。 user-data命令和user-data-file都执行相同的任务,只是它们从不同的输入中读取。 使用此参数时,用户数据的内容将被上载到Amazon托管的URI http://169.254.169.254/1.0/user-data仅对已启动的实例可用。 在Linux环境中执行此操作的通常方法是将shell脚本上传到实例以下载exe,您的用户数据文件可能看起来像这样... #! /bin/bash