9

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

谢谢!

4

2 回答 2

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

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

现在,只要您想显示他们的图片,您就会调用avatar_urlwhich 将检查它是否应该返回预设 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
于 2012-08-07T22:42:46.987 回答
3

我会制作另一个名为 LibraryImages 的资源来保存这些图像文件。

这些将与使用has_many关联的 User 类相关。第二个是当用户想要使用自己的图像而不是预先定义的图像时分开。

因此,我建议添加一个名为“use_library”的布尔类型,一旦他们选择使用自己的图像,它就会毫无问题地上传到 user.image。

现在在您看来,只需询问 use_library 是否返回 true 如果使用image_tag(user.library_image)

于 2012-08-01T15:21:32.857 回答