我有一个rails项目,我正在使用Carrierwave将文件上传到Amazon s3。
当我上传包含空格的文件(例如bad URI(is not URI?)
)时,我的编辑操作出现File Name.mp3
错误。在上传到s3之前,如何将文件名中的空格转换为下划线?
我是否在文档中找不到配置选项,或者我是否需要创建一个方法来执行此操作?
更新
这是我的上传者/ track_uploader.rb:https://gist.github.com/leemcalilly/5025757
以下是我将文件附加到https://gist.github.com/leemcalilly/5025731
的模型这是我的控制器:https://gist.github.com/leemcalilly/5025765
请注意,当我在上传程序中使用"#{original_filename}".underscore
时文件上传很好,但它不会转换文件名,只是保留原始文件名和空格,如下所示:https://www.evernote.com/shard/s3/sh/c5a08968-6f6d-4de8-a768-830a378572bc/10ee719307f3c587b531a37868127209
如果我使用"#{filename}".underscore
,我会收到stack level too deep
错误。
答案 0 :(得分:3)
上传/ track_uploader.rb:
def filename
"#{@original_filename}".gsub(/\s+/, '_')
end
用下划线替换任何空格字符。或者,您可以使用/\W+/
来匹配非单词字符(不是字母,数字或下划线)。
请记住,此方法不会执行任何操作,只会生成基于“@original_filename”的字符串。您仍然需要设置filename属性。
您是否尝试过以下操作?
def fix_filename
@original_filename.gsub!(/\s+/, '_')
end
答案 1 :(得分:1)
尝试使用parameterize
方法。此方法会使uri
变为友好uri
。
例如:
>> "http://songs.com/my file.mp3".parameterize
=> #<ActiveSupport::Multibyte::Chars:0xef4eb5c @wrapped_string="http-songs-com-my-file-mp3">
>> "http://songs.com/my file.mp3".parameterize.to_s
=> "http-songs-com-my-file-mp3"