新手问题 请教一个用 nginx upload module 上传文件到 Rails 后,文件读取 / 改名的问题 (已解决)

hexawing · 2017年04月27日 · 最后由 shiwangewenti 回复于 2022年08月02日 · 2945 次阅读

之前发贴求助过上传的问题,@alucardpj 大侠推荐我用 nginx 的 upload module,几经周折之后,终于可以上传了

然而现在的问题是:

nginx 上传的文件都是 000000001 0000000002 这样子的,无法识别。想用 ruby 读出来然后重命名,但加断点后访问文件时说我没权限。

我开始以为是路径问题,于是把 nginx 配置里的upload_store /tmp/upload_tmp改成了upload_store /home/terry/RubymineProjects/EIMV6/public/uploaded,但是不行;

又把upload_store_access user:rw;改成了upload_store_access user:rw group:rw all:rw;,还是不行。

我的 Rails 里用了一个 carrierwave,这个不重要吧?nginx 配置的接管文件处理的代码长这样:

def self.save_uploaded_file(params)
  z = self.new
  z.name = params[:pdf_file_name]
  z.save!
  byebug
end

断点断住之后报这个错

(byebug) File.read params[:pdf_file_path]
*** Errno::EACCES Exception: Permission denied @ rb_sysopen - /home/terry/RubymineProjects/EIMV6/public/uploaded/0042681049

而且我试了下,直接从 irb 访问,也是报没权限:

terry@TerryUbuntu:~/RubymineProjects/EIMV6$ irb
2.3.0 :001 >  File.read '/home/terry/RubymineProjects/EIMV6/public/uploaded/0000000001'
Errno::EACCES: Permission denied @ rb_sysopen - /home/terry/RubymineProjects/EIMV6/public/uploaded/0000000001
    from (irb):1:in `read'
    from (irb):1
    from /home/terry/.rvm/rubies/ruby-2.3.0/bin/irb:11:in `<main>'
2.3.0 :002 > File.stat '/home/terry/RubymineProjects/EIMV6/public/uploaded/0000000001'
Errno::EACCES: Permission denied @ rb_file_s_stat - /home/terry/RubymineProjects/EIMV6/public/uploaded/0000000001
    from (irb):2:in `stat'
    from (irb):2
    from /home/terry/.rvm/rubies/ruby-2.3.0/bin/irb:11:in `<main>'
2.3.0 :003 > File.file? '/home/terry/RubymineProjects/EIMV6/public/uploaded/0000000001'
 => false 

请各位不吝赐教!谢谢!

建议直接使用 Carrierwave。

如果是真实的业务,可以考虑用第三方存储接在 Carrierwave,例如阿里云、七牛、S3 等。

a0nqm 回复

直接使用 Carrierwave 处理大文件还是略慢啊,上十 M 的中型文件(一些 PDF 资料什么的)要三分多钟。

第三方的……免费的应该没有吧,收费的估计资金批不下来,因为本来就只是个附带功能……

七牛之类的,有免费额度,空间要求不大的话可以免费用。

啊啊啊,我发现我犯了个巨傻的错误……目录没有设权限!!

试了下在 irb 里都访问不到,才想到 cd 一下看看,果然 cd 不进去…………貌似是用 root 创建的文件夹,所以……

先谢谢各位热情支招了!

hexawing 回复

Permission denied @ rb_sysopen 什么意思,怎么解决的呀

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