2012-06-16 28 views
1

我从url下载一个图像到一个ec2实例(wget),使用imagemagick处理它(convert -actions $ savedfilename),然后将它保存到s3(使用php api)。将imagemagick文件直接保存到ec2的s3

  1. 是否有可能在ec2上处理图像并将其直接保存到s3而不写入s3卷?
  2. 如果这是可能的,它是否有意义 - 它会更快/更便宜?
  3. 还有什么可以做的,以提高过程的效率?
  4. 是否有API直接从shell保存到s3?

回答

2

我猜“不写EBS卷......”我说得对你的意思?可以通过管道Wgets直接输出到ImageMagicks转换,它看起来像这样:

wget -O - 'http://d24w6bsrhbeh9d.cloudfront.net/photo/4498158_700b_v1.jpg' | convert - test.png 

s3cmd看一看,它可以让你与S3直接在命令行交互。然后,我们的工作流程示例如下所示:

wget -O - 'http://d24w6bsrhbeh9d.cloudfront.net/photo/4498158_700b_v1.jpg' | convert - test.png && s3cmd put --acl-public --guess-mime-type test.png s3://example.com/images/test.png 

这会给你这样的结果,您可以过滤使用正则表达式来获取公开网址:

:从文本

File 'test.png' stored as s3://example.com/images/test.png (xxxx bytes) 
Public URL of the object is: http://example.com.s3.amazonaws.com/images/test.png 

获取URL

<?php 
    $reg_exUrl = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/"; 
    $cmd_output = "File 'test.png' stored as s3://example.com/images/test.png (xxxx bytes) Public URL of the object is: http://example.com.s3.amazonaws.com/images/test.png"; 
    if(preg_match($reg_exUrl, $cmd_output, $url)) { 
    $image_url = $url[0]; 
    } 
    else { 
    // no url found … 
    } 
?> 

我想这是做你的过程的一种优雅的方式:)我不知道如果它会更快或更便宜...也许有点因为EBS的坏磁盘I/O。

+0

之一我的imagemagick命令有两个步骤,并且需要在应用第二步之前保存第一步的结果。是否有可能将第一步的结果保存在内存中,而不是在第二步中写入卷并从内存访问它? – waigani

+0

发布一些代码,然后我可以帮助你。或者看看这个讨论:http://www.imagemagick.org/discourse-server/viewtopic.php?f=1&t=20906 – dom

+0

+1有用的评论 - 链接正是我所需要的。 – waigani

0

从AWS S3 CLI cp documentation

上传本地文件流至S3

警告:: PowerShell的可改变的编码或添加到CRLF管道 输入。

下面的cp命令会上传标准 输入本地文件流到指定的水桶和关键:

aws s3 cp - s3://mybucket/stream.txt 

如此相似@ DOM的答案,你可以做

wget -O - 'http://d24w6bsrhbeh9d.cloudfront.net/photo/4498158_700b_v1.jpg' | convert - test.png | aws s3 cp - s3://example.com/images/test.png --acl public