1

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

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

aaa@2x.jpg

它被保存为

aaa2x.jpg

此外,~ 被转换为 _。

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

我可以在上传后正则表达式文件名并在数据库中更改它并重命名文件,但这似乎是一个奇怪的黑客行为,有人知道发生了什么吗?如何正确保存文件名?

4

1 回答 1

1

根据这篇文章:http ://en.wikipedia.org/wiki/HFS_Plus ,您应该能够使用任何字符,包括文件名中的 NUL。但操作系统 API 可能会出于遗留原因限制某些字符。

它可能是服务器或客户端问题,尝试调试您的应用程序并检查其中提供的文件名request.request_parameters是否应包含有效的文件名。

如果您要在 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_transliterate.rb回形针模型中:

before_post_process { |c| transliterate_file_name(:file) }

其中:file是由 定义的属性has_attached_file

于 2012-07-10T09:26:41.490 回答