Rails Rails 如何在 production 环境下访问 public 目录下的 uploads 内的图片

zqalyc · 2013年05月04日 · 最后由 ericliu 回复于 2013年06月27日 · 7717 次阅读

我在做图片上传和裁剪,使用 CarrierWave 下载图片在 public 的 uploads 目录下(uploads 目录下还有两级目录是截取图片的名字的前两位自动生成的,保存的图片的名字是根据 MD5 加密生成),在 production 环境下显示不出来,但是在 development 环境下正常。

log 报错信息如下: ActionController::RoutingError (No route matches [GET] "/uploads/photo/cc/55/large_cc55a8a500951a2c9390ec8246179830.jpg");但是目录下有图片。 曾试着把 config.serve_static_assets = false 改为 true,图片能显示,但项目都是乱码了而且官方也不建议这么改 这问题折磨我一星期了,求高手指教

楼主的 html 源码是怎么写的?最好用 image_tag 来,这样保险点= =

我获取图片是用的 image_tag <%=image_tag @photo.remote_photo_path, alt: @user.photos.first.image,:size => "140x160" ,:class=> 'change_photo' %> remote_photo_path 是我保存的图片的路径

carrierwave 教程上使用了 image_url 方法获取图片<%=image_tag(@photos.image_url(:large)%>,但是我生成了子目录保存的图片后就把图片的/uploads/photo/cc/55/large_cc55a8a500951a2c9390ec8246179830.jpg 路径保存在 remote_photo_path 数据库字段内,这样在 development 模式下时正常的,但是 production 下一直不显示,也试过<%=image_tag(@photos.image_url(:large)%>这种方法也不行

这应该不是程序的问题。你检查一下 production 和 development 配置有什么不同,比如: production 是不是用 web server 跑的, 是不是 public 下面的都不能访问还是只是 upload 的目录无法访问,直觉像是 web server 禁止了特定目录的访问

6 楼 已删除

#4 楼 @zlx_star public 新建目录下面的图片都不能访问,除非我在 application.rb 中指定 config.assets.paths << "#{Rails.root}/public/uploads"这样在 uploads 目录下的图片能正常显示,但是我需要在 uploads 下面还要随机自动生成两级子目录来存放图片,如果不把所有的存放图片的目录指定,图片照样不会显示,我要怎么修改才能访问所有的子目录。你说的 web server 那个怎么解除禁止,能详细说明么,非常感谢

#4 楼 @zlx_star log 里面还有"permission denied"的信息,应该是权限问题。我刚接触 rails 是个新手,项目经理催的急,帮助一下,拜托了

楼主给的信息不大够...整个项目推到 github 上让人看看吧

#8 楼 @blacktulip 不能放到 github 上啊,是公司的项目

#7 楼 @zqalyc 不好意思,应该是 http server, 就是 apache、nginx 之类的,贴出你的 http server 的配置文件

#10 楼 @zlx_star

upstream yan_server { server unix:/tmp/unicorn.hmp.sock;

} server { listen 80; server_name localhost;

access_log /home/yan/deploy/tmp/log/access.log; error_log /home/yan/deploy/tmp/log/error.log; root /home/yan/deploy/current/public; index index.html;

location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; try_files /system/maintenance.html $uri $uri/index.html $uri.html @ruby; }

location @ruby { proxy_pass http://yan_server; } }

public 目录下的静态文件,一般都建议单独由 lighttpd、nginx 这类服务器来提供服务 可以单独使用静态域名访问,比如 i.himysql.com 不使用单独域名的话,在 nginx 加上 location ~* .(jpg|png|bmp|gif) { root /your/project/path/public; }

rails 3 的 production 环境默认不处理静态请求。静态请求用 nginx 处理。

不过也可以在 production.rb 处理。但是不应该

#10 楼 @zlx_star #12 楼 @leopku #14 楼 @zhangyuan 谢谢你们的帮助,我终于知道什么问题了,之前把 config.serve_static_assets = false 改为 true 和今天把 nginx 按照楼上说的配置了以后一样出现乱码,好多功能不能用,现在才恍然大悟,原来我把 public 目录暴露出后,在 production 环境会自动生成 index.html 缓存页面,在根目录下会首先自动加载这个缓存页面,所以一直出现乱码。把 config.action_controller.perform_caching = true 改为 false 就正常了,太大意了之前一直以为是 config.serve_static_assets=true 导致的所以没仔细琢磨这个乱码问题。 谢谢大家的热心帮助

rails2.x 的版本中,还支持 / 直接从 public 中直接读资源,后面就不支持了。 使用 ruby server 读静态资源确实会浪费一些性能,在 3 以后变成推荐使用 nginx 读静态资源了。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号