如何从远程服务器直接上传文件到Amazon S3?

22

是否可以从远程服务器上传文件到S3?

远程服务器基本上是一个基于URL的文件服务器。例如,使用http://example.com/1.jpg来提供图像。它除此之外什么也不做,也不能在该服务器上运行代码。

可以让另一个服务器告诉S3从http://example.com/1.jpg上传文件。

           upload from http://example.com/1.jpg 
server -------------------------------------------> S3 <-----> example.com
4个回答

24
如果您不能在服务器上运行代码或执行请求,那么不,您无法这样做。您将不得不将文件下载到自己拥有的服务器或计算机上,并从那里上传。
您可以在http://docs.amazonwebservices.com/AmazonS3/latest/API/APIRest.html上查看Amazon S3上可进行的操作。
检查REST和SOAP API的操作,您会发现没有办法向Amazon S3提供远程URL并让其为您获取对象。所有PUT请求都要求包含请求中的对象数据。这意味着发起Web请求的服务器或计算机需要拥有数据。
我过去也遇到过类似的问题,我想下载用户的Facebook缩略图并将它们上传到S3以在我的网站上使用。我的解决方法是先将图片从Facebook下载到服务器内存中,然后上传到Amazon S3-整个过程不到2秒。上传到S3完成后,将bucket/key写入数据库。
不幸的是,没有其他方法可以这样做。

你是如何将图片下载到内存并上传的呢?我现在也在尝试处理类似的情况,但我找不到一种方法可以在不将文件保存到服务器磁盘的情况下将其下载并上传到S3。 - ahmetcetin
@ahmetcetin 可以使用支持 AWS S3 API 的任何语言编写代码,例如 Go 或 Python,然后在代码中执行下载操作并将下载保存到变量中,再使用该变量填充上传到 S3 API 的调用。 - Scott Stensland

1
从技术上讲,这是可能的,使用 AWS Signature Version 4,假设你的远程服务器是下面图片中的客户端,你可以在主服务器上准备一个表单,并将表单字段发送到远程服务器,以便它curl它。详细示例在这里

Amazon S3 upload using a POST request


1
我认为提供的建议非常好,您可以将文件SCP到S3存储桶中。提供pem文件将实现无密码身份验证,通过PHP文件,您可以验证扩展名。PHP文件可以将文件作为参数传递给SCP命令。
这种解决方案唯一的问题是,您必须拥有在AWS中的实例。如果您的网站托管在其他托管提供商上,并且您正在尝试直接上传文件到S3存储桶,则无法使用此解决方案。

-4

你可以使用终端中的scp命令。

1)在终端中,进入您想要传输到服务器的文件所在的位置

2)输入以下内容:

scp -i yourAmazonKeypairPath.pem  fileNameThatYouWantToTransfer.php ec2-user@ec2-00-000-000-15.us-west-2.compute.amazonaws.com:

注意:在您从Ec2网站上获取的ec2blablbla内容之前添加 " ec2-user@ "!! 这是一个非常挑剔的错误!

3)您的文件将被上传并显示进度。 当进度条到达100%时,您就完成了!


为什么有人会踩这个?你能解释一下吗?这对我很有效! - coolcool1994
6
因为这篇文章特别提到了S3,而S3并不是一个普通的EC2实例,所以它不会运行SSH服务器。你需要使用HTTP协议来与它进行通信。 - mianos
我想你可以启动一个EC2实例,使用它来进行远程复制(服务器-> EC2-> S3),然后再销毁EC2实例。 - Malvineous

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接