carrierwave:指向现有图像

时间:2013-07-14 01:54:44

标签: ruby-on-rails carrierwave

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

在控制台中,我尝试过:

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

但是这无法覆盖图像的路径。

4 个答案:

答案 0 :(得分:4)

进入,迟到总比没有好!警告:这是针对rails 4,我目前只在rails 4.1上进行测试。

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

第1步:让carrierwave告诉我如果可以存储文件的位置:

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

raw_write_attribute不保存任何内容,它只是在设置值时绕过了carrierwave。这使得对象就像从数据库中读取'file.mp3'一样。然后你可以问Carrierwave“文件所在的位置”。然后我将文件直接从客户端上传到S3。完成后,我对Rails进行另一个API调用,它执行以下代码:

 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允许第二次通过未更改。

答案 1 :(得分:2)

我参加派对有点晚了,但您可以使用Active Record的raw_write_attribute方法,例如:

@ image.raw_write_attribute(:path," http://test.s3.amazonaws.com/image/path/0001/image.jpg")

答案 2 :(得分: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网址。

答案 3 :(得分:1)

我发现您实际上可以执行此操作,例如,如果您的mount_uploader:path,那么:

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