在我的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")
但是这无法覆盖图像的路径。
答案 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_column
和update_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