2012-08-01 44 views
9

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

谢谢!

回答

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 

这是假设你可以在http://example.com/images/[name]找到预设的图像,并且使用mount_uploader在CarrierWave命名picture

现在任何时候你想要显示他们的图片,你会打电话avatar_url,这将检查它是否应该返回预设的URL,或他们上传的图片。

你将如何更新library_imagepicture一个例子根据你原来的问题:

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 
+0

我如何可以检测到用户上传新的图片?我的意思是,我应该写入什么回调函数名称来重置library_image?谢谢! – CamelCamelCamel 2012-08-08 06:08:09

+0

@CamelCamelCamel我用一个例子更新了我的原始答案。 – 2012-08-08 18:46:37

+0

如何根据avatar_url将文件作为预设或文件返回? – CamelCamelCamel 2012-08-13 03:57:21

3

我会做另一个名为LibraryImages资源这些图像文件。

这些将与使用has_many关联的User类关联。当用户想要使用自己的图像而不是预先定义的图像时,第二种方法是单独进行。

因此,我会建议添加一个名为'use_library'的布尔类型,一旦他们选择使用自己的图像,它将上传到user.image没有任何问题。

现在

在你看来只是问,如果use_library返回true,如果是使用image_tag(user.library_image)