Carrierwave - 从字符串"上传"文件

Cam*_*mel 9 ruby file-upload ruby-on-rails ruby-on-rails-3 carrierwave

我网站中的用户可以上传自己的模型照片或从库中选择.当用户从库中选择时,我将文件名作为字符串发送到服务器{file: {url: 'url.jpg'}}.我还没有找到一种方法,即载波可以在不上传的情况下更新模型文件.我可以在我的模型中写一个检查该参数是否存在的条件然后model.file = File.open('str.jpg').从安全角度看是不是很糟糕?如何"上传"文件,或者只更新文件属性,以引用服务器上已有的文件?

谢谢!

Zac*_*ker 4

您的使用解决方案File.open可行,但您应该验证该名称是否有效,File.basename以便其他人无法通过../../secret_credentials.yml并公开您不希望他们看到的信息。另外,根据预设图像列表检查它也是一个好主意。

但是,在这种情况下,您可以通过跳过 CarrierWave 来更有效地完成此操作。

添加一个名为 的新字段library_image,当有人想要使用预设图像时,您可以设置library_image,如果他们想要使用自己的照片,请取消设置library_image并照常上传照片。然后添加一个辅助方法,例如:

def avatar_url
    if self.library_image?
        "http://example.com/images/#{self.library_image}"
    else
        self.picture.url
    end
end
Run Code Online (Sandbox Code Playgroud)

这假设您可以在名为 的 CarrierWave 中找到http://example.com/images/[name]您正在使用的预设图像。mount_uploaderpicture

现在,任何时候你想显示他们的图片,你都会调用avatar_url它来检查是否应该返回预设的 URL,或者他们上传的图片。

library_image您将如何更新或picture基于原始问题的示例:

if params[:file].is_a?(Hash)
    model.library_image = params[:file][:url]
    model.remove_picture = true
else
    model.library_image = nil
    model.picture = params[:file]
end
Run Code Online (Sandbox Code Playgroud)