“Errno :: ENOENT没有文件存在”但存在文件DOES。在本地工作,而不是在AWS

时间:2017-12-27 22:46:18

标签: ruby-on-rails ruby amazon-web-services heroku errno

MY CODE BASE SETUP:

  • 使用Postgres在本地部署的Ruby on Rails
  • 使用Heroku(登台和生产服务器)进行生产。

我的问题:事情“看似”在本地机器上工作(没有硬错误)但不在生产中工作。我相信我的问题与将正确的信息发送到ruby file.open()命令有关。

我的生产(登台)服务器上收到以下错误:

  

Errno :: ENOENT in Projects#show   显示/app/app/views/projects/show.html.erb第276行:

     

没有这样的文件或目录@ rb_sysopen - https://[bucketname].s3.amazonaws.com/path/to/instance/of/file/file_name.stl

但如果我将生成的超链接复制/粘贴到我的网络浏览器中,则会提示文件打开/下载菜单。我在这里做错了什么?

背景/历史:

我无法解决问题,而且我已经搜索了很多寻求答案的stackoverflow问题:

  1. ENOENT, no such file or directory but file exists()
  2. File Exists But Receiving ENOENT Error(我没有使用节点,我的服务器每次部署都会重新启动)
  3. Rails 3: Errno::ENOENT exception(如果CentOS和Heroku一样,那么我们就有类似的问题似乎无法回答)。我不确定我的Tmp文件情况。但这个问题听起来与我的问题类似。
  4. Carrierwave, Rails 4; Errno::ENOENT (No such file or directory - identify)(可能相关,但我没有提取imagemagick文件,我正在尝试解析非图像文件)
  5. Remove "www", "http://" from string(我尝试剥离路径的各个部分,以便将file.open()命令提供正确的格式无效
  6. File.open, open and IO.foreach in Ruby, what is the difference?(这有助于我理解每个命令类型之间的区别,这可能是我的问题)。
  7. Open an IO stream from a local file or url(听起来像是一个可靠的修复,但我不知道如何利用这个打开命令,因为gem指定了file.open()命令与这些open()命令。)
  8. 我在我的“项目模型”(project.rb)中定义了以下方法,该方法从特定实例获取项目文件,从“project_file path”输入中,gem解析了我的webapp的STL文件。

    这个特殊的gem - “STL_parser” - 调用file.open(filepath,'rb')命令,这是我相信我的应用程序遇到问题的地方。这是我在我的模型中调用的方法,它调用STL_parser gem:

    def analyze_STL project_file
    
      if Rails.env.development? || Rails.env.test?
        full_path = project_file.current_path
      else
        full_path = project_file.url.to_s
      end
    
      parser = STLParser.new
      parser.process(full_path)
    end
    

    每个案例和环境的结果如下:

    在发展中:

        project_file.current_path
    

    ...对于我的mac上的一个特定实例产生:

        /Users/myname/full/path/to/file/on/laptop/unique_instance_file.stl
    

    结果:应用程序适用于本地计算机。如果我将上述路径复制/粘贴到Chrome等网络浏览器中,则会提示文件打开/下载菜单。

    在生产环境中:

        project_file.current_path 
    

    结果:

      

    Errno :: ENOENT错误 - 没有这样的文件或目录@ rb_sysopen   -uploads /项目/ project_file /实例/ instance_file.stl

    并且显然缺少子域,因此在Production中,我修改了从AWS调用文件URL的路径,如上所示:

     project_file.url.to_s
    
        https://[bucketname].s3.amazonaws.com/path/to/instance/of/file/file_name.stl
    

    结果:

      

    Errno :: ENOENT错误 - 没有这样的文件或目录@ rb_sysopen    - https://[bucketname].s3.amazonaws.com/path/to/instance/of/file/file_name.stl

    ...但如果我将该路径复制/粘贴到我的网络浏览器中,该文件将提示打开/下载菜单。

    因此,路径似乎指向文件的正确,但file.open()命令不喜欢该路径格式。思考?我已经敲打了一段时间了!

    的可能性:

    1. 它是AWS的权限吗?如果是这样,为什么其他ruby Gems生成的其他图像文件在同一个AWS桶中打开?

    2. 当我将完整路径应用为hack ...我的开发环境的URL格式,只需创建一个变量:hacked_path = "localhost:3000"+file_path

    3. ...这会生成Errno :: ENOENT没有这样的文件或目录@ rb_sysopen错误。但我可以在我的网络浏览器中复制/粘贴相同的路径,它会打开一个下载提示。因此,似乎我的浏览器正在拼凑有关如何打开文件的一些信息,但我在我的webapp中调用的Gem并不灵活。我的一个朋友说我的webapp无法在我的本地机器上读取“二进制文件”吗?

      1. 这是file.open(filename, 'rb')open(filename, 'rb')的问题吗?我甚至不知道如何修改gem,但我可以向开发人员寻求帮助。

      2. 这是因为我的应用在尝试处理文件之前没有足够的时间从AWS下载文件吗?

      3. AWS中的CORS权限?

      4. 还有其他更简单的我没有想到的?

      5. 提前感谢您的帮助和反馈!是的我知道我需要更多的编程基础课程。您推荐的任何在线产品?已经从一个月开始了。

0 个答案:

没有答案