我想提供一个通过电子表格导出数据的选项。我不想永久存储它(因此不需要像S3这样的存储服务)。这样做最有效和可扩展的方式是什么?我在哪里可以暂时存储此文件?这是应该发生的事情:
我的2个要求是效率和可扩展性。
答案 0 :(得分:0)
如果我是你,我会寻找一种方法来解析前端的XLS / CSV并将JSON发送到你的后端。这样,您可以将慢速/密集型工作传递给客户端(可伸缩性),并仅在服务器上处理JSON。
答案 1 :(得分:0)
我假设你有一个带有文件输入的表单来选择你想要处理的xls文件:
<input id="my_model_source" type="file" name="my_model[source]">
要处理xls,您可以使用roo gem。
在某些控制器(处理文件的位置)中,您可以收到如下文件:params[:my_model][:source]
。该文件将是ActionDispatch::Http::UploadedFile
个实例。此类具有实例方法path
,可以为您提供临时文件。
所以,对于roo gem,你可以这样读它:
xls = Roo::Spreadsheet.open(params[:my_model][:source].path, extension: :xlsx)
如果您的导入过程不是太重,则选项1将起作用。 如果确实太重,您可以使用Active Job来处理后台处理。
如果选择“活动作业”,则:
将失去使用ActionDispatch::Http::UploadedFile
的{{1}}方法的机会。您需要自己生成临时文件。为此,您可以使用cp
command复制path
的{{1}},无论您想要什么。使用后,您可以使用rm
commnad
将失去实时响应。要处理此问题,您可以使用Job Notifier gem
我试图大致显示您可以采取的路径。