我网站中的用户可以上传自己的模型照片或从库中进行选择。当用户从库中选择时,我将文件名作为字符串发送到服务器{file: {url: 'url.jpg'}}
。我还没有找到一种方法可以让carrierwave 只更新模型文件而不上传它。我可以在我的模型中编写一个条件来检查该参数是否存在,然后model.file = File.open('str.jpg')
. 从安全角度来看,这很糟糕吗?我如何“上传”文件,或者只是更新文件属性,以引用服务器上已经可用的文件?
谢谢!
我网站中的用户可以上传自己的模型照片或从库中进行选择。当用户从库中选择时,我将文件名作为字符串发送到服务器{file: {url: 'url.jpg'}}
。我还没有找到一种方法可以让carrierwave 只更新模型文件而不上传它。我可以在我的模型中编写一个条件来检查该参数是否存在,然后model.file = File.open('str.jpg')
. 从安全角度来看,这很糟糕吗?我如何“上传”文件,或者只是更新文件属性,以引用服务器上已经可用的文件?
谢谢!
您的使用解决方案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_uploader
picture
现在,只要您想显示他们的图片,您就会调用avatar_url
which 将检查它是否应该返回预设 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
我会制作另一个名为 LibraryImages 的资源来保存这些图像文件。
这些将与使用has_many
关联的 User 类相关。第二个是当用户想要使用自己的图像而不是预先定义的图像时分开。
因此,我建议添加一个名为“use_library”的布尔类型,一旦他们选择使用自己的图像,它就会毫无问题地上传到 user.image。
现在在您看来,只需询问 use_library 是否返回 true 如果使用image_tag(user.library_image)