2013-07-14 41 views
5

在我的Rails应用程序中,我使用Carrierwave在Amazon S3上上传图像。我想指出现有的Amazon S3图像,而不必重新上传图像。例如,如果我在http://test.s3.amazonaws.com/image/path/0001/image.jpg上有现有Amazon S3映像,我可以更新映像路径以指向此映像吗?我不想使用远程上传选项,因为我真的只想使用已经存在的相同确切图像(但将其保存在我的记录的“路径”属性中)。carrierwave:指向现有图像

在控制台中,我已经试过:

image.update_attributes(:path=> "http://test.s3.amazonaws.com/image/path/0001/image.jpg") 

但这未能覆盖图像的路径。

+0

你怎么能解决这个问题? – Mohamad

+0

我最终没有创建新记录,只是指向原始记录。 – scientiffic

+0

嗨@scientiffic你找到了解决方案吗?我很有趣 – medBo

回答

0

我发现,你能真正做到这一点,例如,如果你的mount_uploader:path,则:

image.remote_path_url = "http://test.s3.amazonaws.com/image/path/0001/image.jpg" 
image.save 
+0

感谢您的回复。正如我在我原来的文章中所提到的,我不想重新上传文件,我相信这是您使用remote_path_url进行的操作并保存。 – scientiffic

+0

任何你不想重新上传文件的理由?在我的情况下,它将取代现有的文件,而且速度更快,而不是从本地机器上传。不幸的是,我没有看到有没有这样做的载波的替代方式。 – shinnyx

+0

我发现重新上传文件对我的应用来说太慢了。相反,我只是检测新记录是否指向另一个图像并替换视图中的图像(而不是我的数据库中)。 – scientiffic

2

我有点迟到了,但你可以使用Active Record的raw_write_attribute方法是这样的:

@ image.raw_write_attribute(:路径, “http://test.s3.amazonaws.com/image/path/0001/image.jpg”)

+0

据我所知,这不会将值保存到数据库中,甚至不允许您使用@ image.save将其写入数据库,因为就模型而言,没有任何保存! – Daniel

3

插嘴,迟到总比不到好!警告:这是针对rails 4的,我现在只在rails 4.1上进行测试。

这是比它应该更难,methinks!这对我来说绝对至关重要的原因是,由于CloudFlare SSL的限制(以及常识),我附加了100MB + MP3文件,这在我的主机上是无法接收的。幸运的是,AWS支持预授权上传,和我carrierwave来为我做正确的事:

第1步:获得carrierwave告诉我哪里会,如果它可以存储一个文件:

m.raw_write_attribute('file','file.mp3'); 
url = m.file.url 
signed = aws_presigned_url(url) 

raw_write_attribute做不保存任何内容,只需在设置值时绕过载波。这使得对象的行为就好像从数据库中读取'file.mp3'一样。然后你可以问Carrierwave“文件在哪里居住”。然后我直接从客户端上传文件到S3。如果这样做了,我再拍API调用的Rails,执行以下代码:

m.raw_write_attribute('file','file.mp3'); 
m.update_attribute('file','file.mp3'); 

各地Carrierwave这两个配对搞定。第一个使得carrierwave认为'file'列被设置为'file.mp3',第二个明确地告诉rails将'file.mp3'持久化到DB。由于raw_write_attribute呼叫,Carrierwave允许第二个通过未更改。

2

在我的情况update_columnupdate_columns伟大工作:

model.update_columns file_1: 'filename.txt' 

更新列是逗号:

model.update_column :file_1, 'filename.txt' 

这将不会运行任何回调并设置列filename.txt

当我做model.file_1.url我得到正确的S3网址。