ruby-on-rails - Ruby File.exist?在文件可读之前返回 true
问题描述
我有一个 Rails 应用程序,我试图将大型 PDF 的创建传递给后台进程,并允许用户在完成后查看它。这是一个与 combine_pdf gem 结合并传递给delayed_job 的多页文档。
我有 3 个操作:第一个创建并保存文件,第二个通过异步请求以短延迟重复调用以检查文件是否存在,第三个在浏览器中显示 PDF。
我在使用第二部分时遇到了问题File.exist?('my_file.pdf')
,但这是true
在文件完成保存之前返回的。随后显示的用于查看 PDF 的链接会导致错误 (ActionController::MissingFile)。该文件实际上会在大约 10 秒后变为可用,此时链接可以正常工作。
我猜该文件在检查时仍在写入?如何检查文件保存是否已完成并且文件实际上可以读取?
解决方案
您可以写入临时文件,然后在完成后重命名它。到目前为止,您还没有包含您的代码,但这样的事情可能对您有用:
def write_and_replace(path, file, file_name, data)
file_path = File.join(folder_path, "#{file_name}.pdf")
temp_file_path = File.join(folder_path, "temp_#{file_name}.pdf")
File.open(temp_file_path, 'w') { |f| f.write(data) }
# Args: existing file, new name
File.rename(path, file_path)
File.rename(temp_file_path, file)
File.delete(file_path)
end
推荐阅读
- azure-lab-services - Azure 实验室服务:模板中有多个 VM?
- elasticsearch - 内部对象之间的 Elasticsearch 查询时间戳差异
- string - 比较字符串和数字的方法
- dart - 如何从特定索引的列表中获取项目?
- sql - 选择查询以使用 BigQuery 对输出 json 中的记录进行分组
- gremlin - 无法在 Janusgraph 中使用 Cardinality.list 更新顶点属性
- python - 如何使用 Python 中的时间序列预测来预测未来日期?
- python - 抑制函数的输出
- c# - 在 C# 中使用 LINQ 从另外两个具有相同 ID 的数据表中创建一个新的 DataTable
- docker - 如何通过 Docker 网桥使用 Curl 从 Jenkins 将文件发布到 Go 服务器?