使用Heroku和Amazon S3上使用Active Storage上传的Roo gem打开一个远程文件

时间:2019-05-15 15:37:06

标签: heroku rails-activestorage roo-gem

我正在使用ROO gem解析用户在Heroku上上传的Excel文件(带有AWS S3的Active Storage)。

由于我在Heroku上,因此无法将其下载到文件系统上然后进行解析。如何从HTTP打开它?

模型

class Report < ApplicationRecord
  has_one_attached :search_report


def parsing_method(path_http)

   xlsx = Roo::Spreadsheet.open(path_http)
end 

2 个答案:

答案 0 :(得分:0)

在类似的应用程序中,我使用了它:

def parsing_method(path_http)

   xlsx = Roo::Excelx.new(path_http, nil, :ignore)

end 

它应该为您工作。

答案 1 :(得分:0)

是的,您可以在 Heroku 中将其下载到文件系统中。

我怀疑有多少空间,但您应该能够使用临时文件。大多数系统会先将上传内容存储到临时文件系统中,然后再将其推送到其他地方。

我已经这样做了,因为 Roo 打了补丁可以从流中打开 Excel 文件,但不能打开其他类型(csv、ods 等)。

def create_temp_file
  filename = some_model.some_attachment.blob.filename
  @tmp = Tempfile.new([filename.base, filename.extension_with_delimiter], binmode: true)
  @tmp.write(ome_model.some_attachment.download)
  @tmp.rewind
  @tmp
end

# this is how you use it, note the rescue part
def access_the_file
  spreadsheet = Roo::Spreadsheet.open(create_temp_file)
  # access the spreadsheet as usual
rescue
  @tmp&.unlink
end

这会保留文件前缀和扩展名(对于让 Roo 推断文件是什么很重要)并确保文件在完成后被删除。