Ruby on rails 在Rails3上使用回形针时,上载时文件名中的某些字符(@和~)会被删除或更改

Ruby on rails 在Rails3上使用回形针时,上载时文件名中的某些字符(@和~)会被删除或更改,ruby-on-rails,file-upload,Ruby On Rails,File Upload,我不确定这是否是回形针的问题。在gitlab上尝试过,同样的事情发生了 我有一个用Rails编写的iOS应用程序的后端,当我上传文件名中带有@字符的图像文件时,如果我有一个名为 aaa@2x.jpg 它被保存为 aaa2x.jpg 而且,~会被转换成一个u 这是一个问题,因为iOS应用程序假定支持视网膜的图像以@2x前缀命名 我可以在上传后对文件名进行正则化,并在数据库中对其进行更改,然后重命名文件,但这似乎是一种奇怪的黑客行为,有人知道发生了什么吗?首先,如何正确保存文件名?根据本文:,您

我不确定这是否是回形针的问题。在gitlab上尝试过,同样的事情发生了

我有一个用Rails编写的iOS应用程序的后端,当我上传文件名中带有@字符的图像文件时,如果我有一个名为

aaa@2x.jpg
它被保存为

aaa2x.jpg
而且,~会被转换成一个u

这是一个问题,因为iOS应用程序假定支持视网膜的图像以@2x前缀命名


我可以在上传后对文件名进行正则化,并在数据库中对其进行更改,然后重命名文件,但这似乎是一种奇怪的黑客行为,有人知道发生了什么吗?首先,如何正确保存文件名?

根据本文:,您应该能够使用任何字符,包括文件名中的NUL。但由于遗留原因,操作系统API可能会限制某些字符

它可能是服务器或客户端问题,请尝试调试您的应用程序并检查
请求中提供的文件名。请求\u参数
应包含有效的文件名

如果你打算在URL中使用上传的文件,你应该在上传之前对它们进行音译,这也解决了你的问题。为此,您可以使用此扩展:

module TransliteratePaperclip
   def transliterate_file_name(paperclip_file)
    paperclip_file=[paperclip_file] unless paperclip_file.is_a?(Enumerable)
    paperclip_file.each do |file|
      filename=read_attribute("#{file}_file_name")
      if filename.present?
        extension = File.extname(filename).gsub(/^\.+/, '')
        filename = filename.gsub(/\.#{extension}$/, '')
        self.send(file).instance_write(:file_name, "#{filename.parameterize}.#{extension.parameterize}")
      end
    end
  end
end

 # include the extension 
 ActiveRecord::Base.send(:include, TransliteratePaperclip)
将此代码放入
/config/initializers/paperclip\u transliterate.rb
和您的回形针模型中:

before_post_process { |c| transliterate_file_name(:file) }

如果
:file
是由
定义的属性,根据本文:,您应该能够使用任何字符,包括文件名中的NUL。但由于遗留原因,操作系统API可能会限制某些字符

它可能是服务器或客户端问题,请尝试调试您的应用程序并检查
请求中提供的文件名。请求\u参数
应包含有效的文件名

如果你打算在URL中使用上传的文件,你应该在上传之前对它们进行音译,这也解决了你的问题。为此,您可以使用此扩展:

module TransliteratePaperclip
   def transliterate_file_name(paperclip_file)
    paperclip_file=[paperclip_file] unless paperclip_file.is_a?(Enumerable)
    paperclip_file.each do |file|
      filename=read_attribute("#{file}_file_name")
      if filename.present?
        extension = File.extname(filename).gsub(/^\.+/, '')
        filename = filename.gsub(/\.#{extension}$/, '')
        self.send(file).instance_write(:file_name, "#{filename.parameterize}.#{extension.parameterize}")
      end
    end
  end
end

 # include the extension 
 ActiveRecord::Base.send(:include, TransliteratePaperclip)
将此代码放入
/config/initializers/paperclip\u transliterate.rb
和您的回形针模型中:

before_post_process { |c| transliterate_file_name(:file) }
其中
:file
是由
已附加文件
定义的属性