2

I have stored an file in AWS s3 storage when trying to open an file to import data using roo gem, It raising following error Errno::ENOENT: No such file or directory @ rb_sysopen

def self.import(file, user_id)
        imported_file = ImportedFile.find(file)
        spreadsheet = Roo::Spreadsheet.open(open(imported_file.file_url), extension: :csv)
        spreadsheet = Roo::Spreadsheet.open(imported_file.file)
      header = spreadsheet.row(1)//raising error here
end

I even tried this also

spreadsheet = Roo::Spreadsheet.open(imported_file.file_url)

Getting below error in log

Errno::ENOENT: No such file or directory @ rb_sysopen - /uploads/imported_files/7a6f0463-b3cd-48f8-a579-bc27951242fe/13c96e3e-d3f3-4ed8-8d9a-b9ea03c0cc8c.csv
Qwertie
  • 5,784
  • 12
  • 45
  • 89
raj_acharya
  • 665
  • 5
  • 17
  • Doesn‘t look like a full URL – neuhaus Oct 11 '17 at 03:25
  • @neuhaus, I tried with full url followed by https, header = spreadsheet.row(1), Errno::ENOENT: No such file or directory rb_sysopen - /uploads/imported_files/7a6f0463-b3cd-48f8-a579-bc27951242fe/13c96e3e-d3f3-4ed8-8d9a-b9ea03c0cc8c.csv – raj_acharya Oct 11 '17 at 03:36

2 Answers2

5

To open URLs you should require the open-uri library first:

require 'open-uri'

See the example:

open('http://example.com/')
# throws Errno::ENOENT: No such file or directory @ rb_sysopen - http://example.com/

require 'open-uri'
open('http://example.com/')
# opens the website
KARASZI István
  • 30,900
  • 8
  • 101
  • 128
  • I accept your answer, but it is not working with spreadsheet = Roo::Spreadsheet.open(open(imported_file.file_url)), throwing ArgumentError: Can't detect the type of /tmp/open-uri20171011-8816-ckswos - please use the :extension option to declare its type. but after passing extension along with this spreadsheet = Roo::Spreadsheet.open(open(imported_file.file_url), extension: :csv) it was working fine, but I am thinking it is not a perfect solution – raj_acharya Oct 11 '17 at 07:00
  • I believe Roo is trying to - questionably - guess the file type by the extension and `open-uri` downloads the URL to a temporary file, that is the reason you need to set the extension. – KARASZI István Oct 11 '17 at 08:04
2

Finally following code is worked for me.

spreadsheet = Roo::Spreadsheet.open(open(imported_file.file_url), extension: File.extname(imported_file.file_url).gsub('.','').to_sym) rescue nil
raj_acharya
  • 665
  • 5
  • 17