Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将图像上载到S3_C#_Asp.net Mvc_Asp.net Mvc 3_Amazon S3 - Fatal编程技术网

C# 将图像上载到S3

C# 将图像上载到S3,c#,asp.net-mvc,asp.net-mvc-3,amazon-s3,C#,Asp.net Mvc,Asp.net Mvc 3,Amazon S3,我在一个图像托管网站上工作,我有点为难。我选择Amazon S3是因为它速度快,可扩展,而且是现收现付模式 当我从我的网站上传图像时,我需要在服务器上处理它们——创建3种不同大小的图像,将数据插入数据库,然后准备上传到S3(图像的所有3种大小) 我目前正在使用plupload进行上传,我现在将其全部设置为使用我的DB作为图像的存储—只是为了测试目的。但我刚刚意识到——上传到我的web服务器,处理然后上传到S3意味着每个图像的上传时间会增加一倍,对吗 有什么聪明的方法来处理这种情况吗 当然,您需要

我在一个图像托管网站上工作,我有点为难。我选择Amazon S3是因为它速度快,可扩展,而且是现收现付模式

当我从我的网站上传图像时,我需要在服务器上处理它们——创建3种不同大小的图像,将数据插入数据库,然后准备上传到S3(图像的所有3种大小)

我目前正在使用plupload进行上传,我现在将其全部设置为使用我的DB作为图像的存储—只是为了测试目的。但我刚刚意识到——上传到我的web服务器,处理然后上传到S3意味着每个图像的上传时间会增加一倍,对吗


有什么聪明的方法来处理这种情况吗

当然,您需要更多节省时间的图像,因为实际上您将有两个HTTP传输。您可以尝试与其他操作并行执行上载,例如:

  • 开始将原始/最大图像上载到S3
  • 同时,准备另外两张图片
  • 同时上传另外两张图片
  • 我怀疑上传原始/最大的图像比生成两个较小的图像需要更多的时间,因此并行解决方案将非常有效。即使上传比生成另外两个图像花费更少的时间,上传也不会占用太多CPU时间,因此在所有情况下,您都应该看到改进


    当然,它更复杂,特别是当您考虑错误处理时。

    我们在S3中处理文件和存储时也在做类似的事情。主要区别在于,我们的Web服务器和处理服务器都在EC2上,因此它们与S3之间不会产生任何传输成本,而且到S3的带宽非常高。是否可以在EC2实例上运行图像大小调整过程?您可以:

  • 接受直接上传到EC2实例上的服务器进程,立即处理它们,然后将映像保存到S3,或者

  • 将图像直接上传到S3,以某种方式向EC2进程发出图像到达的信号(可能是SQS队列),然后让服务器进程响应该信号,从S3抓取文件,处理图像,并将调整大小的图像保存回S3

  • 基本上,我是说你应该利用这一点(来自AWS站点上的S3描述):

    这项服务不收取数据传输费用 Amazon EC2之间传输的数据 和亚马逊S3在同一地区 或用于在 亚马逊EC2北弗吉尼亚地区 以及亚马逊S3美国标准区域


    再看看你的问题,你似乎很关心“每张图片的上传时间”——你指的是等待你的web应用的最终用户吗?您不必等到图像大小调整并上传到S3后才向上传用户返回响应。用户上传完成后,应将作业排队,并立即向用户返回响应。然后有一个单独的后台线程,该线程将作业从队列中移除,并在后台执行图像处理。作业完成后,将其上载到S3并更新数据库,以反映已调整大小的图像在那里。

    这看起来确实很有趣。虽然我认为,要真正从中受益,我可能必须将整个web应用程序移动到EC2(因为每个请求都需要做其他事情,而不仅仅是图像处理,比如db工作)——我对EC2一无所知,在他们的网站上看起来相当复杂:)对,这肯定是一个概念上的障碍,如果你不需要的话,这可能是不必要的麻烦。我认为你不必将整个应用程序移动到EC2。您可以使用消息队列或其他方法在应用程序和EC2作业处理器之间进行协调,因此EC2进程只是执行“哑”图像大小调整和保存到S3。我想这些双重传输是无法避免的-我希望有人有一个很酷的尖端技巧,就像从网络服务器上传一点一点地与进入网络服务器的文件并行-但我认为我在科幻领域有这样的思路:)然而,感谢你的指点-尽管我从中得到的可能微不足道,由于我并不真正担心图像大小调整的cpu处理时间,但传输时间让我感到害怕:/再看看你的问题,似乎你关心的是“每张图像的上载时间”——你指的是等待你的web应用程序的最终用户吗?您不必等到图像大小调整并上传到S3后才向上传用户返回响应。用户上传完成后,应将作业排队,并立即向用户返回响应。然后有一个单独的后台线程,该线程将作业从队列中移除,并在后台执行图像处理。作业完成后,将其上载到S3并更新数据库,以反映已调整大小的图像在那里。这太可怕了。。。我刚从我的一个朋友那里得到了完全相同的建议。我想这就是我现在要走的路。我只需要用一种友好的方式让用户知道,他们的图像正在被处理:)如果你想快速复制到答案中,我接受:)干杯!希望对你有用。