2015-10-14 1 views
0

J'ai donc un formulaire qui permet de soumettre plusieurs images à la fois. J'ai également écrit un wrapper pour l'API Imgur dans Ruby. Mon problème est que puisque cela se produit de manière complètement synchrone, cela prend une éternité et expire même pour 10 images. Je me demande s'il y a une meilleure façon de traiter plus d'images. Tout ce que je peux penser est de soumettre de manière asynchrone des formulaires avec une image chacun, mais je ne suis pas sûr si c'est une bonne idée ou si elle ne fera que retarder d'autres demandes.Le téléchargement de plusieurs images vers l'API Imgur avec Ruby est lent

class MissionsController < ApplicationController 
    def add_images 
    image_ids = params[:images].collect do |image| 
     Image.with_imgur(
     title: "#{@mission.trip.name} - #{current_user.username}", 
     image: image, 
     album_id: @mission.album.imgur_id, 
     user_id: current_user.id, 
     trip_id: @mission.trip_id 
    ).imgur_id 
    end 
    end 
end 

class Image < ActiveRecord::Base 
    def self.with_imgur(options) 
    trip_id = options.delete(:trip_id) 
    user_id = options.delete(:user_id) 
    image = Imgur::Image.create(options) 
    create(
     imgur_id: image["id"], 
     link: image["link"], 
     trip_id: trip_id, 
     user_id: user_id 
    ) 
    end 
end 

https://github.com/tomprats/toms-missions/blob/master/app/models/imgur.rb#L116

class Imgur::Image < Base 
    def self.create(options) 
    url = "https://api.imgur.com/3/image" 
    params = { 
     image: options[:image], 
     album: options[:album_id], 
     type: options[:type] || "file", # "file" || "base64" || "URL" 
     title: options[:title], 
     description: options[:description] 
    } 
    api_post(url, params).body["data"] 
    end 
end 

Répondre

0

Je prendrais un coup d'œil à Typhée https://github.com/typhoeus/typhoeus - Je l'ai utilisé dans le passé pour gérer les téléchargements, etc pour Amazon Glacier. J'ai trouvé que cela pourrait être beaucoup plus rapide - Typhoeus vous donne un futur objet et va gérer le téléchargement de vous en arrière-plan sans bloquer l'application.

J'espère que cela aide!