paperclip 上传文件(解决中文文件无法上传问题)

本文介绍如何在Rails应用中使用Paperclip插件自定义上传文件的名称,通过在保存前更改文件名为系统随机指定的形式,如日期加随机数组合,以解决文件名统一管理和国际化问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在新项目中使用了paperclip这个文件上传插件,一切都很满意,但是对于它不能自定义文件名就比较郁闷了,一直想实现这个功能,不过一直没时间去看paperclip的源代码(其实因为懒)。

我说的自定义文件名,不是网上多数教程所说的修改文件存储的文件夹路径,打个比方,我上传了一个叫做 test.gif 的文件,服务器上存储的文件的文件名同样是 test.gif ,而我希望是系统随机地指定一个文件名给上传的文件,我希望在服务器上存储的文件名不是原来的 test.gif,而是 2010070100000.gif 这种由我指定的文件,这样可以统一文件,防止用户上传的文件是一些乱七八糟的名字,而且我们的项目面向中英文用户,当然是不希望英文用户看到一些中文名字的文件。

废话说完,上代码。
这个代码不是我写的,在网上看到的,原文链接
[url]http://trevorturk.com/2009/03/22/randomize-filename-in-paperclip/[/url]
在需要上传文件的model中加入如下代码:

before_create :randomize_file_name

private
def randomize_file_name
#archives 就是你在 has_attached_file :archives 使用的名字
extension = File.extname(archives_file_name).downcase
#你可以改成你想要的文件名,把下面这个方法的第二个参数随便改了就可以了。
self.archives.instance_write(:file_name, "#{Time.now.strftime("%Y%m%d%H%M%S")}#{rand(1000)}#{extension}")
end

代码一目了然,原理就是在保存之前,先把文件名给改了,简单直接。

paperclip 这个文件上传插件比起 file_column要好用得多,而且 file_column 已经多年没有更新了,推荐大家使用 paperclip。

另外,如果你使用jQuery的话,配合 jQuery Multiple File Upload Plugin 这个插件,相当的好用。[url]http://www.fyneworks.com/jquery/multiple-file-upload/[/url]

原文地址:[url]http://yangzhihuan.iteye.com/blog/704331[/url]

[b]备注:ruby1.9.2老是提示中文问题,还是老老实实安安心心用ruby1.8.7-p302了。[/b]


有一个回复也比较好,但是我自己没有尝试:

[quote][quote]木剑先生 写道
如果有N多model需要使用随机文件名,你所有的MODEL都要这么改

可以修改paperclip插件下lib/paperclip/attachment.rb

在assign(upload file)方法中有一个
instance_write(:file_name,"#{Time.now.strftime("%Y%m%d%H%M%S")}#{rand(1000)}#{extension}")

这样就一劳永逸了[/quote]
我个人不太喜欢直接修改插件的源代码(除非有bug)。如果所有的model都使用随机名的话,我目前使用的是继承(项目需求是这样),所以要上传文件的model都继承自 Attachment 类,这样只要改 Attachment 就可以了。当然这是由我项目需要决定的。

比较通用的做法是这样:


module AbstractAttachment
def self.included(model)
model.before_create :randomize_file_name
end

private
def randomize_file_name
#archives 就是你在 has_attached_file :archives 使用的名字
extension = File.extname(archives_file_name).downcase
#你可以改成你想要的文件名,把下面这个方法的第二个参数随便改了就可以了。
self.archives.instance_write(:file_name, "#{Time.now.strftime("%Y%m%d%H%M%S")}#{rand(1000)}#{extension}")
end
end

然后在所有要使用这个功能的model加上一句:

class Attachment
include AbstractAttachment
end


个人以为这样比改插件的源代码要好。[/quote]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值