From 1ac3941130781d881cc0bca5fe8a0d94401ff95e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Mon, 15 Jun 2015 16:12:15 +0200 Subject: [PATCH] FEATURE: allow API to upload files synchronously --- app/controllers/uploads_controller.rb | 84 +++++++++++++++------------ 1 file changed, 46 insertions(+), 38 deletions(-) diff --git a/app/controllers/uploads_controller.rb b/app/controllers/uploads_controller.rb index 5f8921a6797..29e1150b0b3 100644 --- a/app/controllers/uploads_controller.rb +++ b/app/controllers/uploads_controller.rb @@ -7,48 +7,21 @@ class UploadsController < ApplicationController file = params[:file] || params[:files].first url = params[:url] client_id = params[:client_id] - - Scheduler::Defer.later("Create Upload") do - begin - # API can provide a URL - if file.nil? && url.present? && is_api? - tempfile = FileHelper.download(url, SiteSetting.max_image_size_kb.kilobytes, "discourse-upload-#{type}") rescue nil - filename = File.basename(URI.parse(file).path) - else - tempfile = file.tempfile - filename = file.original_filename - content_type = file.content_type - end - - # when we're dealing with an avatar, crop it to its maximum size - if type == "avatar" && FileHelper.is_image?(filename) - max = Discourse.avatar_sizes.max - OptimizedImage.resize(tempfile.path, tempfile.path, max, max, allow_animation: SiteSetting.allow_animated_avatars) - end - - upload = Upload.create_for(current_user.id, tempfile, filename, tempfile.size, content_type: content_type) - - if upload.errors.empty? && current_user.admin? - retain_hours = params[:retain_hours].to_i - upload.update_columns(retain_hours: retain_hours) if retain_hours > 0 - end - - if upload.errors.empty? && FileHelper.is_image?(filename) - Jobs.enqueue(:create_thumbnails, upload_id: upload.id, type: type, user_id: params[:user_id]) - end - - data = upload.errors.empty? ? upload : { errors: upload.errors.values.flatten } - - MessageBus.publish("/uploads/#{type}", data.as_json, client_ids: [client_id]) - ensure - tempfile.try(:close!) rescue nil - end - end + synchronous = is_api? && params[:synchronous] # HACK FOR IE9 to prevent the "download dialog" response.headers["Content-Type"] = "text/plain" if request.user_agent =~ /MSIE 9/ - render json: success_json + if synchronous + data = create_upload(type, file, url) + render json: data.as_json + else + Scheduler::Defer.later("Create Upload") do + data = create_upload(type, file, url) + MessageBus.publish("/uploads/#{type}", data.as_json, client_ids: [client_id]) + end + render json: success_json + end end def show @@ -74,4 +47,39 @@ class UploadsController < ApplicationController render nothing: true, status: 404 end + def create_upload(type, file, url) + begin + # API can provide a URL + if file.nil? && url.present? && is_api? + tempfile = FileHelper.download(url, SiteSetting.max_image_size_kb.kilobytes, "discourse-upload-#{type}") rescue nil + filename = File.basename(URI.parse(file).path) + else + tempfile = file.tempfile + filename = file.original_filename + content_type = file.content_type + end + + # when we're dealing with an avatar, crop it to its maximum size + if type == "avatar" && FileHelper.is_image?(filename) + max = Discourse.avatar_sizes.max + OptimizedImage.resize(tempfile.path, tempfile.path, max, max, allow_animation: SiteSetting.allow_animated_avatars) + end + + upload = Upload.create_for(current_user.id, tempfile, filename, tempfile.size, content_type: content_type) + + if upload.errors.empty? && current_user.admin? + retain_hours = params[:retain_hours].to_i + upload.update_columns(retain_hours: retain_hours) if retain_hours > 0 + end + + if upload.errors.empty? && FileHelper.is_image?(filename) + Jobs.enqueue(:create_thumbnails, upload_id: upload.id, type: type, user_id: params[:user_id]) + end + + upload.errors.empty? ? upload : { errors: upload.errors.values.flatten } + ensure + tempfile.try(:close!) rescue nil + end + end + end