我有一个可以在我的项目上正常运行的下载功能,过程是创建一个包含两个pdf文件的文件夹,将其压缩到tmp文件夹中,然后下载它,当我部署分支时,一切在localhost上都可以正常运行在生产模式下,我遇到一个错误:实际上,除了下载功能之外,包含报告的文件夹的创建和zip压缩过程工作正常。
这是 route.rb 文件:
get 'reports/:id/download' => 'reports#download_report', as: "download_report"
DownloadReportHelper
def self.zip_pdf(report, path, current_company)
if File.exist?(temporary_dir_path(report, current_company)+ ".zip")
FileUtils.rm(temporary_dir_path(report, current_company)+ ".zip")
end
directory = File.join( File.dirname( path ) )
zipfile_name = File.join( File.dirname( path ) ) + '.zip'
Zip::ZipFile.open( zipfile_name, Zip::ZipFile::CREATE ) do |zipfile|
Dir[ File.join( directory, '*' ) ].each do |file|
zipfile.add( File.basename( file ), file )
end
end
end
ReportsController :
def download_report
report = Report.find( params[ :id ] ).decorate
report_pdfs_path = DownloadReportHelper.generate_public_and_internal_pdf( report, current_company )
DownloadReportHelper.zip_pdf( report, report_pdfs_path, current_company )
send_file( "#{ File.dirname(report_pdfs_path) }.zip")
report.update!(last_downloaded_at: DateTime.current)
end
生成用于下载报告的链接结构如下:
https://company.domainname.com/reports/c2b4e249-175d-4d92-90e1-a7cac5b329c0/download
我知道了:
无法访问此网站
任何人都可以帮助您找出问题所在,以及为什么它可以在localhost上正常运行,但不能在生产环境中运行?
答案 0 :(得分:0)
通常不应在应用程序控制器内部直接处理复杂的文件操作,数据提取,报告等。您可能会在本地使用少量数据集来摆脱它,但是在生产环境中,这肯定无法扩展,并且大多数Web服务器默认超时时间约为30-45秒。这意味着,如果您向服务器发送一个http请求,并且服务器花费的时间超过了默认超时时间,它将仅执行超时操作而不响应。解决此问题的方法是使用后台作业。
Rails提供了ActiveJob,并且要在生产环境中使用它,您需要选择一个后端。这是一些可能的选择。
https://github.com/mperham/sidekiq/