不知道为什么隐藏文件在那里,它可能是 X-send-file 甚至 wget 的分支(部分进度或其他东西)。
理想情况下,您应该使用 Tempfile 来执行此类操作。该代码基于您对您正在做的事情的评论。另外,我使用了两个 gem,一个用于下载,另一个用于压缩。这样,您根本不需要创建文件夹,只需一个 zip 文件即可。zip 的所有内容文件将自行删除。下载 zip 后,只需将其删除。在这里我还要提一下,您可能会在某处遇到故障,因为 send_file 会将传输移交给网络服务器,因此您不会在文件仍在提供服务时删除 rails 进程。因此,即使这样,并且它在 localhost 上运行良好,我强烈建议在生产中使用自定义的预定后台垃圾收集器。
require 'open-uri'
require 'zip/zip'
zip_path = "#{Rails.root}/public/test.zip"
urls_to_fetch = ['abc.com', 'xyz.com']
Zip::ZipFile.open(zip_path, Zip::ZipFile::CREATE) do |zipfile|
urls_to_fetch.each_with_index do |url, index|
# intialize new temp file
file = Tempfile.new(index.to_s)
# fetch the file using open-uri or wget and save it as a tmpfile
open(url, 'rb') do |read_file|
file.write(read_file.read)
end
end
# add the temp file to the list of files to zip
zipfile.add(File.basename(file), file.path)
end
# send the zipfile for download
send_file zip_path
# delete the zipfile
FileUtils.rm zip_path
但是,这不应该是强制性的。如果你在没有 Tempfiles 的情况下做事,请检查 rails runner 对目标目录的权限。
FileUtils 文档包含有关尝试删除文件/文件夹时的本地安全漏洞的详细信息。