在Rails中的send_file之后删除文件夹

JJ *_*eck 4 ruby-on-rails sendfile

我正在file.txt使用我的Rails控制器发送文件send_file,然后删除包含它的文件夹.

send_file("#{Rails.root}/public/folder/file.txt")
FileUtils.remove_dir "#{Rails.root}/public/folder", true
Run Code Online (Sandbox Code Playgroud)

当我这样做时,file.txt被发送和删除.但是,folder没有被删除.但如果我删除该send_file行,folder则将被删除.

如何删除它folder

编辑:有趣的是,我发现里面folder有一个隐藏文件.__afs2B0C,可能会阻止删除.我不知道这个文件是如何创建的!该文件仅在大约15分钟后才会消失.

EDIT2:我试过检查临时文件的内容vi,但这是不可读的乱码.当我只删除该send_file行时,该文件夹被正确删除.当我只删除该FileUtils.remove_dir行时,该文件夹不包含临时文件.

Ken*_*ant 7

你确定send_file在删除目录时仍然没有发送文件,如果使用X-SendFile它可能是异步的吗?这会在尝试删除目录时导致错误.

因此,您应该将此删除操作排队,或者稍后使用清扫程序进行排队,而不是在将文件发送到流后直接执行此操作.

我不完全清楚您要发送的文件,因此包含文件路径的实际示例,文件类型以及如何在您的问题中创建它是有用的.

可能的调试帮助:

执行以下操作时登录并监视该文件夹:

  • 写出一个非常大的文件(> 60MB说),并确认在文件创建过程中没有创建不可见文件 - 我不清楚你实际发送的是哪个文件
  • 在慢速连接上设置大型文件传输,并观察此文件的创建和可能增长(例如,它可能与压缩文件中的文件有关).

鉴于sendfile可能仍在通过Web服务器发送(对于大文件)(x-send-file现在是默认值),当您尝试删除时,我会尝试查看延迟解决方案.

可能的解决方案:

  • 使用send_data而不是send_file(如果文件很小)
  • 安排删除文件夹以便稍后使用delayed_job
  • 设置清扫工具,在每天结束时删除文件夹