【问题标题】:Carrierwave and delayed_job uploading single file two times in the upload directoryCarrierwave和delayed_job在上传目录中两次上传单个文件
【发布时间】:2014-03-11 08:33:28
【问题描述】:

我尝试从我的示例应用上传大文件(最大 2 GB)。我正在使用 carrierwave gem 进行文件上传

在上传文件时,它花费了太多时间,而且在上传时它正在分配服务器进程。搜索后我得到了这个link。所以我尝试使用 delayed job 作为后台进程。

为了使用组合载波和延迟工作,我遵循了这个tutorial。 我执行了教程中提到的所有步骤。文件上传成功。

但在查看上传的目录后,我发现该文件以不同的名称上传了两次,例如 bitrate_128k_IMG_5099.MOV 和 IMG_5099.MOV

我尝试调试它,但没有得到任何解决方案。

video.rb

class Video < ActiveRecord::Base  
  mount_uploader :video, VideoUploader  
  after_save :enqueue  
end

videos_controller.rb

class VideosController < ApplicationController    
  def index
  end

  def show
    @video = Video.find(params[:id])
  end

  def new
    @video = Video.new(video_params)    
  end

  def create    
    @video = Video.new(video_params)    
    if @video.save
      redirect_to @video
    else
      render :nothing => true, :status => 400
    end
  end

  private
  def video_params
    params.require(:video).permit(:attachment, :zencoder_output_id, :processed, :video, :meta_info, :processing) if params[:video]
  end 
end

/uploader/video_uploader.rb

# encoding: utf-8
require File.join(Rails.root, "lib", "carrier_wave", "ffmpeg") 
require File.join(Rails.root, "lib", "carrier_wave", "delayed_job")

class VideoUploader < CarrierWave::Uploader::Base

  include CarrierWave::Delayed::Job 
  include CarrierWave::FFMPEG 

  storage :file

  def store_dir
    "videos/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  version :bitrate_128k do 
    process :resample => "128k" 
  end

  def extension_white_list
    %w(avi mov mkv mpg mpeg mp4 m4v flv ogv)
  end  
end

lib/carrier_wave/delayed_job.rb

# lib/carrier_wave/delayed_job.rb
module CarrierWave
  module Delayed
    module Job
      module ActiveRecordInterface
        def delay_carrierwave
          @delay_carrierwave ||= true
        end

        def delay_carrierwave=(delay)
          @delay_carrierwave = delay
        end

        def perform
          asset_name = self.class.uploader_options.keys.first
          self.send(asset_name).versions.each_pair do |key, value|
            value.process_without_delay!
          end
        end

        private
        def enqueue
          ::Delayed::Job.enqueue self
        end
      end

      def self.included(base)
        base.extend ClassMethods
      end

      module ClassMethods
        def self.extended(base)
          base.send(:include, InstanceMethods)
          base.alias_method_chain :process!, :delay
          ::ActiveRecord::Base.send(:include, CarrierWave::Delayed::Job::ActiveRecordInterface)
        end

        module InstanceMethods
          def process_with_delay!(new_file)
            process_without_delay!(new_file) unless model.delay_carrierwave
          end
        end
      end
    end
  end
end

controller/videos/new.html.erb

<h2>Upload your Video</h2>

<%= form_for @video, :html => {:multipart => true} do |f| %>  
  <p>
    <%= f.label :attachment %><br />
    <%= f.text_field :attachment %>
  </p>
  <p>
    <%= f.file_field :video %>
  </p>
  <p><%= f.submit %></p>
<% end %>

如何停止这两次录制。 我为此使用 rails 4。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 carrierwave delayed-job


    【解决方案1】:

    这是因为 CarrierWave 也存储原始文件。尝试改变这个:

    version :bitrate_128k do 
      process :resample => "128k" 
    end
    

    到:

    process :resample => "128k" 
    

    这应该只存储一个重新采样到 128k 的文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-23
      • 1970-01-01
      • 2018-03-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多