2

我正在使用carrierwave和carrierwave后台(https://github.com/lardawge/carrierwave_backgrounder)和延迟的工作在后台上传文件。当我尝试上传我的文件时,它上传成功,我可以看到作业在背景,但我看不出使用延迟作业和不使用延迟作业有什么区别。在不延迟作业的情况下执行与延迟作业所需的时间相同。不知道出了什么问题,请帮助。提前致谢。

这是我的上传器

             # encoding: utf-8

        class AvatarUploader < CarrierWave::Uploader::Base

          # Include RMagick or MiniMagick support:
          # include CarrierWave::RMagick
          # include CarrierWave::MiniMagick

          include ::CarrierWave::Backgrounder::Delay
          include Sprockets::Helpers::RailsHelper

          include Sprockets::Helpers::IsolatedHelper
         # Choose what kind of storage to use for this uploader:
           storage :file
           # storage :fog

        # Override the directory where uploaded files will be stored.
        # This is a sensible default for uploaders that are meant to be mounted:
        def store_dir
          "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
        end

       def cache_dir
           ""
       end


        # Provide a default URL as a default if there hasn't been a file uploaded:
       def default_url
         "rails.png"
       end


    end

config/initializers/carrierwave_backgrounder.rb 中的carrierwave 背景文件

            CarrierWave::Backgrounder.configure do |c|
             c.backend :delayed_job, queue: :carrierwave 
            end

后模型

        class Post < ActiveRecord::Base
          attr_accessible :description , :avatar, :remote_avatar_url
          mount_uploader :avatar,   AvatarUploader
          process_in_background :avatar
          validates_presence_of :description
        end

后控制器动作

        def create
          @post = Post.new(params[:post])
          respond_to do |format|
         if @post.save
           format.html { redirect_to @post, notice: 'Post was successfully created.' }
           format.json { render json: @post, status: :created, location: @post }
         else
           format.html { render action: "new" }
           format.json { render json: @post.errors, status: :unprocessable_entity }
         end
      end
    end

这是我的看法

        <%= form_for(@post) do |f| %>
          <% if @post.errors.any? %>
          <div id="error_explanation">
          <h2><%= pluralize(@post.errors.count, "error") %> prohibited this post from      being saved:</h2>

         <ul>
         <% @post.errors.full_messages.each do |msg| %>
         <li><%= msg %></li>
         <% end %>
         </ul>
        </div>
       <% end %>

      <div class="field">
       <%= f.label :description %><br />
       <%= f.text_area :description %>
      </div>
      <div class="field">
       <%= f.file_field :avatar %>
      </div>
        <div class="actions">
        <%= f.submit %>
      </div>
     <% end %>
4

2 回答 2

14

CarrierWave Backgrounder不会在后台进行初始文件传输。它可以做两件事:

process_in_background让后台任务处理“处理”,这就是carrierwave 所说的调整图像大小、更改格式、生成缩略图和执行其他自定义操作的步骤。原始图像仍然像往常一样“存储”(如下所述)。

store_in_background让后台任务处理“存储”,这就是 carrierwave 所称的步骤,它将上传的图像移动到本地磁盘上的最终位置,或者如果您使用雾化,则移动到远程服务器(如 S3)上。

您已将模型配置为process_in_background,但您的上传器未配置为进行任何处理,因此您没有观察到任何变化,正如预期的那样。如果您愿意,您可以将您的模型配置为 also store_in_background,但是因为您使用的是本地文件存储(文件副本通常非常快),所以这对您的应用程序基本上没有影响。

有关处理和存储的更多信息,请参阅Carrierwave 自述文件

于 2013-09-03T21:18:24.107 回答
0

我建议您改用Carrierwave Direct

于 2017-12-05T10:13:28.437 回答