Получение чередующихся ошибок HTTP и ошибок ввода-вывода с Rails 3, Paperclip и Uploadify - PullRequest
2 голосов
/ 04 августа 2011

У меня действительно странное поведение. По сути, когда я иду к пакетной загрузке файлов, каждый файл будет чередоваться, начиная с ошибки HTTP, затем следуя с ошибкой ввода-вывода для следующего файла. Еще более интересным является то, что это не всегда происходит в Chrome - иногда ошибки HTTP не появляются, и каждый чередующийся файл успешно загружается (при каждом получении ошибки ввода-вывода). Но в Firefox мы получаем чередующиеся ошибки, несмотря ни на что. Смотрите следующий скриншот:

http://i.imgur.com/0mHWS.png

В моих логах нет ошибок, и все выглядит так, как должно. Ниже приведены соответствующие части моего кода, а также фрагмент из моего файла журнала.

Я знаю, что намного ниже, но я довольно отчаянно нуждаюсь в решении, и я в своем уме. Спасибо всем, кто может предложить любую помощь!

Приложение / промежуточного / flash_session_cookie_middleware.rb

require 'rack/utils'

class FlashSessionCookieMiddleware
  def initialize(app, session_key = '_session_id')
    @app = app
    @session_key = session_key
  end

  def call(env)
    if env['HTTP_USER_AGENT'] =~ /^(Adobe|Shockwave) Flash/
      req = Rack::Request.new(env)
      env['HTTP_COOKIE'] = [ @session_key,
                             req.params[@session_key] ].join('=').freeze unless req.params[@session_key].nil?
      env['HTTP_ACCEPT'] = "#{req.params['_http_accept']}".freeze unless req.params['_http_accept'].nil?
    end

    @app.call(env)
  end
end

session_store.rb

Mysite::Application.config.session_store :cookie_store, :key => '_mysite_session'

# Use the database for sessions instead of the cookie-based default,
# which shouldn't be used to store highly confidential information
# (create the session table with "rails generate session_migration")
# Mysite::Application.config.session_store :active_record_store
Rails.application.config.middleware.insert_before(
  ActionDispatch::Session::CookieStore,
  FlashSessionCookieMiddleware,
  Rails.application.config.session_options[:key]
)

photo.rb

require 'paperclip_processors/watermark'
require 'paperclip_processors/ao'

class Photo < ActiveRecord::Base
belongs_to :user
belongs_to :owner, :polymorphic => true
belongs_to :parentcat, :polymorphic => true
has_many :comments, :as => :owner, :dependent => :destroy

has_attached_file :image, 
                :styles => { :admin_thumb => {
                              :geometry => "48x48#",
                              :processors => [:ao]
                              },
                            :gallery_thumb => {
                              :geometry => "106x106#",
                              :processors => [:ao]
                              },
                            :hero => {  
                              :processors => [:watermark],
                              :geometry => "568",
                              :watermark_path => "#{Rails.root}/public/images/watermark_250.png", 
                              :position => 'SouthWest',
                              },
                            :listing => {  
                              :processors => [:ao],
                              :geometry => "150x150#"
                            }
                           },
               :storage => :s3,
               :s3_credentials => "#{RAILS_ROOT}/config/s3.yml",
               :path => "/:style/:id/:filename"
end

batch_upload.html.erb

<% content_for :javascript do %>
    <%= javascript_include_tag "uploadify/swfobject.js" %>
    <%= javascript_include_tag "uploadify/jquery.uploadify.v2.1.4.min.js" %>
 <% end %>

<% content_for :stylesheets do %>
    <%= stylesheet_link_tag "uploadify.css" %>
 <% end %>


<script type="text/javascript">
<%- session_key = Rails.application.config.session_options[:key] -%>

  $(function() {  
    // Create an empty object to store our custom script data
    var uploadify_script_data = {};

    // Fetch the CSRF meta tag data
    var csrf_token = $('meta[name=csrf-token]').attr('content');
    var csrf_param = $('meta[name=csrf-param]').attr('content');

    // Now associate the data in the config, encoding the data safely
    uploadify_script_data[csrf_param] = encodeURI(csrf_token);

    // Associate the session information
    uploadify_script_data['<%= session_key %>'] = '<%= cookies[session_key] %>';    
    uploadify_script_data['gallery_id'] = <%= @gallery.id %>

     // Configure Uploadify
    $('#photo_image').uploadify ({
      'script'          : '<%= batch_create_gallery_path(@gallery) %>',
      'uploader'        : '/javascripts/uploadify/uploadify.swf',
      'multi'           : true,
      'auto'            : true,
      'scriptData'      : uploadify_script_data,
      'cancelImg'       : '/images/cancel.png'  //take care that the image is accessible
    });
  });
</script>

<h2><%= @page_title = "Batch Upload for #{@gallery.title}" %></h2>

<h3>Upload a Photo</h3>
<% form_for Photo.new(:owner_id => @gallery.id), :html => {:multipart => true} do |f| %>
    <div class="field imagefield">
        <%= f.label :image, 'Image upload' %>
        <%= f.file_field :image %>
    </div>
  <div class="actions">
    <%= f.submit "Batch Upload" %>
  </div>
<% end %>

gallery_controller.rb

 def batch_create
     @gallery = Gallery.find(params[:gallery_id])
     params[:Filedata].content_type = MIME::Types.type_for(params[:Filedata].original_filename).to_s

     @photo = @gallery.photos.build
     @photo.title = params[:Filename]
     @photo.image = params[:Filedata]

     if @photo.save!
       render :json => { 'status' => 'success'  }
     else
       render :json => { 'status' => 'error'  }
     end
 end

фрагмент журнала одного из созданий пакетной загрузки

Started POST "/galleries/199/batch_create" for 127.0.0.1 at Thu Aug 04 02:58:33 -0400 2011
  Processing by GalleriesController#batch_create as HTML
  Parameters: {"Filename"=>"1967_MercBenz_250SL_31.jpg", "_mysite_session"=>"BAh7CSIQX2NzcmZfdG9rZW4iMWtRSm1iOWFuZHFZbXNjcmZaTWVRdUowU3hjVGZDc0dBai9CKzF1MStWaVk9Ig9zZXNzaW9uX2lkIiUwMDc2NTVjY2IwNDE5ZmY4YzQ4OTA3Mzk4ODQzM2FhYyIZd2FyZGVuLnVzZXIudXNlci5rZXlbCCIJVXNlclsGaQciIiQyYSQxMCR6V0V4NXNDMGRNbkRhb3l4Z01oOE5PIgpmbGFzaElDOiVBY3Rpb25EaXNwYXRjaDo6Rmxhc2g6OkZsYXNoSGFzaHsGOgtub3RpY2UiR0dhbGxlcnkgd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLiBZb3UgbWF5IG5vdyBiYXRjaCB1cGxvYWQgcGhvdG9zLgY6CkB1c2VkbzoIU2V0BjoKQGhhc2h7AA==--e1fea6f4d32b97a12368146c4b0502c6df1b67dc", "folder"=>"/galleries/199/", "authenticity_token"=>"kQJmb9andqYmscrfZMeQuJ0SxcTfCsGAj/B 1u1 ViY=", "Upload"=>"Submit Query", "id"=>"199", "Filedata"=>#<ActionDispatch::Http::UploadedFile:0x104440340 @tempfile=#<File:/var/folders/gr/px9hb0ns3w13t4k487k8cgzc0000gn/T/RackMultipart20110804-71738-bzeny5-0>, @content_type="application/octet-stream", @original_filename="1967_MercBenz_250SL_31.jpg", @headers="Content-Disposition: form-data; name=\"Filedata\"; filename=\"1967_MercBenz_250SL_31.jpg\"\r\nContent-Type: application/octet-stream\r\n">, "gallery_id"=>"199"}
  SQL (0.1ms)  BEGIN
[paperclip] Saving attachments.
  SQL (0.1ms)  COMMIT
Geokit is using the domain: localhost
  SQL (7.7ms)  SHOW TABLES
  Gallery Load (0.2ms)  SELECT `galleries`.* FROM `galleries` WHERE `galleries`.`id` = 199 LIMIT 1
  SQL (0.4ms)  SHOW TABLES
  SQL (0.6ms)  SHOW TABLES
Completed   in 370ms
Redirected to http://localhost:3000/

Ответы [ 2 ]

0 голосов
/ 26 января 2013

Я полностью отказался от этого решения и использовал загрузчик файлов jQuery Райана Бейтса: http://railscasts.com/episodes/381-jquery-file-upload

0 голосов
/ 22 ноября 2011

Вы пытались устранить S3 как источник проблемы? Последовательность этой проблемы заставляет меня чувствовать, что скрипт uploadify не является фактическим источником проблемы. Кроме того, попробуйте :s3_credentials => "#{Rails.root}/config/s3.yml" вместо.

...