上传并处理电子表格而不永久存储

时间:2016-06-25 01:54:47

标签: ruby-on-rails ruby-on-rails-4

我想提供一个通过电子表格导出数据的选项。我不想永久存储它(因此不需要像S3这样的存储服务)。这样做最有效和可扩展的方式是什么?我在哪里可以暂时存储此文件?这是应该发生的事情:

  1. 列表项
  2. 用户上传电子表格
  3. 我的后端处理它并更新数据库
  4. 放弃电子表格
  5. 我的2个要求是效率和可扩展性。

2 个答案:

答案 0 :(得分:0)

如果我是你,我会寻找一种方法来解析前端的XLS / CSV并将JSON发送到你的后端。这样,您可以将慢速/密集型工作传递给客户端(可伸缩性),并仅在服务器上处理JSON。

你可以从这里开始: https://stackoverflow.com/a/37083658/1540290

答案 1 :(得分:0)

我假设你有一个带有文件输入的表单来选择你想要处理的xls文件:

<input id="my_model_source" type="file" name="my_model[source]">

要处理xls,您可以使用roo gem

选项1:

在某些控制器(处理文件的位置)中,您可以收到如下文件:params[:my_model][:source]。该文件将是ActionDispatch::Http::UploadedFile个实例。此类具有实例方法path,可以为您提供临时文件

所以,对于roo gem,你可以这样读它:

xls = Roo::Spreadsheet.open(params[:my_model][:source].path, extension: :xlsx)

选项2:

如果您的导入过程不是太重,则选项1将起作用。 如果确实太重,您可以使用Active Job来处理后台处理。

如果选择“活动作业”,则:

  • 将失去使用ActionDispatch::Http::UploadedFile的{​​{1}}方法的机会。您需要自己生成临时文件。为此,您可以使用cp command复制path的{​​{1}},无论您想要什么。使用后,您可以使用rm commnad

  • 删除
  • 将失去实时响应。要处理此问题,您可以使用Job Notifier gem

我试图大致显示您可以采取的路径。