5

在我的 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

4 回答 4

5

插话,迟到总比没有好!警告:这是针对 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不保存任何东西,它只是在设置值时绕过载波。这使得对象的行为就像它从数据库中读取“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 允许第二次通过未更改。

于 2015-02-26T17:48:33.237 回答
3

就我而言update_columnupdate_columns效果很好:

model.update_columns file_1: 'filename.txt'

更新列是逗号:

model.update_column :file_1, 'filename.txt'

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

当我这样做时,model.file_1.url我会得到正确的 S3 URL。

于 2016-09-26T15:10:44.783 回答
2

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

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

于 2014-04-14T09:08:47.243 回答
1

我发现你实际上可以做到这一点,例如如果你的mount_uploaderis :path,那么:

image.remote_path_url = "http://test.s3.amazonaws.com/image/path/0001/image.jpg"
image.save
于 2013-07-30T09:05:28.900 回答