在使用Carrierwave上传到s3之前,如何将空格转换为下划线?

时间:2013-02-24 20:50:21

标签: ruby-on-rails amazon-s3 carrierwave

我有一个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错误。

2 个答案:

答案 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"