我有创建CSV并将其作为下载内容提供给用户的逻辑,但是我想要做的是每周在非工作时间自动创建CSV一次,然后将其上传到S3并从那里提供。希望大大减少用户的下载时间,因为生成CSV需要花费几分钟。
我唯一缺少的步骤是如何将该CSV保存到主机。我打算做的是将其保存到主机,将其上传到S3,然后从主机中删除。
有什么想法可以做到这一点吗?谢谢。
答案 0 :(得分:3)
您可以像这样在主机服务器中创建并保存CSV。
CSV.open(Rails.root.join('tmp', 'csv_cache', "#{csv_name}"), "wb") do |csv|
# your logic
end
这将在tmp/csv_cache
文件夹中创建一个csv_name中指定的名称的CSV。
然后您可以像这样将其上传到s3
file_url = Utils.new().upload_to_s3(csv_name, Rails.root.join('tmp', 'csv_cache', csv_name))
class Utils
def upload_to_s3(file_name, source)
obj = AMAZON_S3_CLIENT.bucket(S3_BUCKET).object('csv_cache/'+file_name)
obj.upload_file source, {acl: 'public-read'}
return obj.public_url
end
end
然后您可以从服务器中删除文件。
答案 1 :(得分:1)
服务器上的简单bash脚本如何:
#!/bin/bash
#
# Save this file to /home/user/upload.sh
curl -o /tmp/csv_file.csv http://localhost/path/to/csv
aws s3 mv /tmp/csv_file.csv s3://bucket/
然后通过cron安排脚本
# /etc/crontab
# Run every day at 08.15
15 08 * * * user /home/user/upload.sh
注意:http://localhost/path/to/csv
与您的按钮链接所指向的URL相同。
答案 2 :(得分:0)
尝试使用将每周运行CSV任务(作业)的sidekiq或cron。在此任务中,CSV使用“ CSV.open”保存到主机,然后上传到S3。
您可能需要一个表来存储文件的S3路径。或者我想您可以覆盖旧文件并重新使用S3路径。