Rails中图片名是中文的时候找不到图片

[color=blue]http://localhost:3000/images/products/地铁.jpg[/color]

在在项目的images/products目录中有一个名为 地铁.jpg的图片文件 ,可是我在浏览器中请求上面的地址,却提示:
[size=large]Routing Error[/size]

[color=red]No route matches "/images/products/%E5%9C%B0%E9%93%81.jpg" with {:method=>:get}[/color]

这个问题是怎么回事呢?与字符编码有文件吗?
环境:我是在xp上开发的
[b]问题补充:[/b]
[quote="nt大哥"]
URL 是不允许中文的,所以"地铁"被你的浏览器自动转义成 UTF-8 序列 "%E5%9C%B0%E9%93%81" 了,而 "%E5%9C%B0%E9%93%81.jpg" 这个文件的确是不存在 ……
[/quote]

这种方法我试过:我将图片文件 夹中的地铁.jpg重命名为%E5%9C%B0%E9%93%81.jpg
然后再请求:http://localhost:3000/images/products/地铁.jpg
或者http://localhost:3000/images/products/%E5%9C%B0%E9%93%81.jpg

还是出现以上的路由提示错误。我请求http://localhost:3000/images/rails.png是可以看到rails的logo的。

我在各个浏览器上都测试验了,还是出现刚才的问题。

你是用的自己写的图片上传方法,至于你说的用插件,我不能采用,到时候移到JRUBY环境,java平台的tomcat中有些问题。

难道就没有解决方案吗?你说的[color=red]URL 是不允许中文的[/color]我感觉 不正确,我在网上看到有用中文url的,这个就是:
http://zoomtype.info/虚拟主机
[b]问题补充:[/b]
:( 还是没有解决问题

唔,有点问题。

改良一下,浏览器的名字不会变,而且不会产生循环跳转了:
路由:
[code="ruby"]map.connect 'product/images/:name.:ext', :controller => 'img_redirect', :action => 'show'[/code]

img_redirect_controller.rb
[code="ruby"]
require 'iconv'
class ImgRedirectController < ApplicationController
def show
name = Iconv.conv 'gb2312','utf-8', params[:name]
file = "#{RAILS_ROOT}/public/images/#{name}.#{params[:ext]}"
if File.exist? file
send_file file, :type => "image/#{params[:ext]}", :disposition => 'inline'
else
render :text => 'file not exist'
end
end
end
[/code]

URL 是不允许中文的,所以"地铁"被你的浏览器自动转义成 UTF-8 序列 "%E5%9C%B0%E9%93%81" 了,而 "%E5%9C%B0%E9%93%81.jpg" 这个文件的确是不存在 ……

方案一 不用中文文件名。

方案二 用文件管理的插件如 attachment_fu。

方案三 手动搞 …… 我能想到的一个笨办法是配置 route.rb 让这类 url 映射到一个 controller 里,然后用 CGI.unescape() 转成 UTF-8 的文件名,接着用 Iconv 转成符合系统编码的文件名,然后读这个文件 ……

中文 URL 无非是浏览器给你转码了…… 如果你输入 %E5%9C%B0%E9%93%81 浏览器也会帮你改成 "地铁"。

[code="ruby"]01> require 'cgi';CGI.unescape "%E5%9C%B0%E9%93%81"
#=> "\345\234\260\351\223\201"
02> s=_
#=> "\345\234\260\351\223\201"
03> require 'iconv'
#=> true
04> Iconv.conv 'gb2312','utf-8',s
#=> "\265\330\314\372"
05> puts _
地铁
#=> nil
06> puts s
鍦伴搧
#=> nil[/code]

%B0%E9%93%81 在 gb2312 的文件系统中显示为"鍦伴搧" …… 所以,如果用 "[color=red]鍦伴搧.png[/color]" 当文件名,输入"地铁.png"就能认了 ……

如果服务器的系统以 UTF-8 为默认编码,就不会担忧这种怪现象了……

那么…… 做个控制器转发如何?

路由:将认不出来的请求都送给 img_redirect 控制器处理
[code="ruby"]map.connect 'images/:name.:ext', :controller => 'img_redirect', :action => 'img_redirect'[/code]

img_redirect_controller.rb
将请求转码,然后转到正确的路径名上
[code="ruby"]
require 'iconv'
class ImgRedirectController < ApplicationController
def img_redirect
name = Iconv.conv 'gb2312','utf-8', params[:name]
redirect_to "/images/#{name}.#{params[:ext]}"
end
end
[/code]

再有就是那个 attachment_fu 其实没问题的,只是一个插件,插件的代码会被 JRuby 当做工程的代码一起打包的。

朋友,问题要自动关闭啦,结分哦