1

Carrierwave、s3、fog を使用して動画をアップロードしています。動画が 5 MB を超えないように、file_size_validator ファイルを追加しました。

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 タスクを作成しましたが、これは問題なく機能し、同様の形式を使用してこれらの一時ファイルとフォルダーを削除しました。タスクを実行しようとすると、次のエラーが発生します。

video.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 の代わりに rm_rf を使用すると、アクセス許可エラーが解消され、フォルダーが正常に削除されます。

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

于 2013-04-22T04:23:48.500 に答える