新手问题 rails 关于 send_file 方法

a-wing · 2018年05月25日 · 最后由 a-wing 回复于 2018年05月25日 · 3326 次阅读

开发环境下正常

Sent file public/plans/1523708711 (1.3ms)

到产品环境下就报错

ActionController::MissingFile (Cannot read file public/plans/1524803824):

可能和这个地方有关。。还是必须用 NGINX 之类的设置服务目录。。。(下载文件这个功能用的少。我不需要优化啊?)


# Disable serving static files from the `/public` folder by default since
  # Apache or NGINX already handles this.
  config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?

  # Specifies the header that your server uses for sending files.
  # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache
  # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX

看报错是 文件没找到啊,你的生产环境上真的有这个文件么?

IChou 回复

绝对有。。。而且其他在读取 public/plans/ 的文件也报错

像这样

[ActiveJob] [MissionsRunJob] [57448be1-a767-49f1-8c16-e3c662525a52] Error performing MissionsRunJob (Job ID: 57448be1-a767-49f1-8c16-e3c662525a52) from Async(default) in 967.24ms: Errno::ENOENT (No such file or directory @ rb_file_s_stat - public/plans/1527229786)

但在开发环境就正常

看上去就是你在 ActiveJob 操作里面使用了异步任务 send_file?是这样么?

4 楼 已删除
IChou 回复

不不。这个两个地方。都读取public/plans/ 里的文件。但都读不到。。。一个是点击下载 使用 send_file。另一个是 ActiveJob 的异步任务

建议直接到线上的 console 里面调试一下,排除下是不是权限问题什么的

就是加到 777 还是不行。。。

send_file(File.join('public', 'plans', @plan.file))

倒觉得是 send_file 开发和生产环境表现不一样

1、可能是没有权限 2、或者路径本身有问题

a-wing 回复
Dir.entries("public/plans").grep(@plan.file) 

看看输出啥

gaolei14 回复

是路径问题。。我直接写绝对路径就好使了

send_file(File.join('home','rails', '********', 'public', 'plans', @plan.file))

产品环境的执行路径貌似不是当前路径

IChou 回复

线上怎么进 rails 的 console 啊。。。

irb(main):001:0> Dir.entries("public/plans").grep(1527229786)
=> []
irb(main):002:0>
ls public/plans/1527229786
public/plans/1527229786

取绝对路径用

Rails.root.join('public', 'plans', @plan.file)

线上进 console RAILS_ENV=production bin/rails c

你试一下 send_data

14 楼 已删除
IChou 回复

非常感谢

最后解决:

send_file("#{Rails.root}/public/plans/#{@plan.file}")
需要 登录 后方可回复, 如果你还没有账号请 注册新账号