1

我正在使用 Carrierwave、s3 和雾来上传视频。我添加了一个 file_size_validator 文件,以便视频不能大于 5mb。

我对 Carrierwave 工作原理的理解(如果不正确,请告知)。Carrierwave 将文件的副本保存到 tmp 文件夹,然后对其执行验证,如果通过,文件将上传到 S3,下面的代码会从本地文件系统中删除 tmp 文件:

video_uploader.rb

before :store, :remember_cache_id
  after :store, :delete_tmp_dir

  def cache_dir
    Rails.root.join('public/uploads/tmp/videos') 
  end

    # store! nil's the cache_id after it finishes so we need to remember it for deletion
  def remember_cache_id(new_file)
    @cache_id_was = cache_id
  end

  def delete_tmp_dir(new_file)
    # make sure we don't delete other things accidentally by checking the name pattern
    if @cache_id_was.present? && @cache_id_was =~ /\A[\d]{8}\-[\d]{4}\-[\d]+\-[\d]{4}\z/
      FileUtils.rm_rf(File.join(root, cache_dir, @cache_id_was))
    end
  end

如果文件未通过验证,则不会调用 before_store 和 after_store 回调,并且 tmp 文件保留在 tmp 文件夹中并且不会被删除。

在此处输入图像描述

所以我们必须自己处理删除这些文件(再次请告知是否有一种通用的方法来做到这一点)。我创建了一个 cron rake 任务,删除与视频相关的屏幕截图,效果很好,然后使用类似的格式删除这些临时文件和文件夹。尝试运行任务时出现以下错误:

视频.rake

task :delete_tmp_files do
  FileUtils.rm Dir.glob("#{Rails.root}/public/uploads/tmp/screenshots/*")
end

task :carrierwave_tmp do 
  CarrierWave.clean_cached_files!
end

task :delete_unsaved_videos do
  FileUtils.rm Dir.glob("#{Rails.root}/public/uploads/tmp/videos/*")
end

rake delete_unsaved_videos
rake aborted!
Operation not permitted - /user/me/projects/teebox_network/public/uploads/tmp/videos/20130421-1853-8808-1646

使用 sudo 运行 rake(仅用于调试)会抛出此问题。

sudo bundle exec rake delete_unsaved_videos
Could not find rake-10.0.4 in any of the sources
Run `bundle install` to install missing gems.

运行 bundle install 没有任何效果。

有谁知道为什么会这样?尝试删除这些文件夹是权限错误吗?有没有更好的方法来处理验证失败的 tmp 文件?

4

1 回答 1

3

使用 rm_rf 而不是 rm 克服了权限错误并成功删除了文件夹。

FileUtils.rm_rf Dir.glob("#{Rails.root}/public/uploads/tmp/videos/*")

于 2013-04-22T04:23:48.500 回答