Ruby on rails 在Rails3上使用回形针时,上载时文件名中的某些字符(@和~)会被删除或更改
我不确定这是否是回形针的问题。在gitlab上尝试过,同样的事情发生了 我有一个用Rails编写的iOS应用程序的后端,当我上传文件名中带有@字符的图像文件时,如果我有一个名为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前缀命名 我可以在上传后对文件名进行正则化,并在数据库中对其进行更改,然后重命名文件,但这似乎是一种奇怪的黑客行为,有人知道发生了什么吗?首先,如何正确保存文件名?根据本文:,您
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
是由已附加文件定义的属性