mirror of
https://github.com/discourse/discourse.git
synced 2025-02-25 18:55:32 -06:00
Merge pull request #956 from ZogStriP/fix-image-upload-to-s3
fix image uploads on s3/imgur
This commit is contained in:
@@ -4,10 +4,14 @@ class UploadsController < ApplicationController
|
||||
def create
|
||||
requires_parameter(:topic_id)
|
||||
file = params[:file] || params[:files].first
|
||||
|
||||
# only supports images for now
|
||||
return render status: 415, json: failed_json unless file.content_type =~ /^image\/.+/
|
||||
|
||||
upload = Upload.create_for(current_user.id, file, params[:topic_id])
|
||||
|
||||
render_serialized(upload, UploadSerializer, root: false)
|
||||
|
||||
rescue FastImage::ImageFetchFailure
|
||||
render status: 422, text: I18n.t("upload.image.fetch_failure")
|
||||
rescue FastImage::UnknownImageType
|
||||
@@ -15,4 +19,5 @@ class UploadsController < ApplicationController
|
||||
rescue FastImage::SizeNotFound
|
||||
render status: 422, text: I18n.t("upload.image.size_not_found")
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
@@ -73,8 +73,7 @@ class SiteSetting < ActiveRecord::Base
|
||||
setting(:crawl_images, !Rails.env.test?)
|
||||
setting(:enable_imgur, false)
|
||||
setting(:imgur_client_id, '')
|
||||
setting(:imgur_client_secret, '')
|
||||
setting(:imgur_endpoint, "http://api.imgur.com/3/image.json")
|
||||
setting(:imgur_endpoint, "https://api.imgur.com/3/image.json")
|
||||
setting(:max_image_width, 690)
|
||||
client_setting(:category_featured_topics, 6)
|
||||
setting(:topics_per_page, 30)
|
||||
@@ -165,7 +164,7 @@ class SiteSetting < ActiveRecord::Base
|
||||
setting(:enable_s3_uploads, false)
|
||||
setting(:s3_access_key_id, '')
|
||||
setting(:s3_secret_access_key, '')
|
||||
setting(:s3_region, 'us-west-1')
|
||||
setting(:s3_region, '')
|
||||
setting(:s3_upload_bucket, '')
|
||||
|
||||
setting(:default_trust_level, 0)
|
||||
|
||||
@@ -1,4 +1,8 @@
|
||||
require 'digest/sha1'
|
||||
require 'image_sizer'
|
||||
require 'imgur'
|
||||
require 's3'
|
||||
require 'local_store'
|
||||
|
||||
class Upload < ActiveRecord::Base
|
||||
belongs_to :user
|
||||
@@ -7,96 +11,39 @@ class Upload < ActiveRecord::Base
|
||||
validates_presence_of :filesize
|
||||
validates_presence_of :original_filename
|
||||
|
||||
# Create an upload given a user, file and topic
|
||||
def self.create_for(user_id, file, topic_id)
|
||||
return create_on_imgur(user_id, file, topic_id) if SiteSetting.enable_imgur?
|
||||
return create_on_s3(user_id, file, topic_id) if SiteSetting.enable_s3_uploads?
|
||||
return create_locally(user_id, file, topic_id)
|
||||
end
|
||||
# retrieve image info
|
||||
image_info = FastImage.new(file.tempfile, raise_on_failure: true)
|
||||
# compute image aspect ratio
|
||||
width, height = ImageSizer.resize(*image_info.size)
|
||||
|
||||
# Store uploads on imgur
|
||||
def self.create_on_imgur(user_id, file, topic_id)
|
||||
@imgur_loaded = require 'imgur' unless @imgur_loaded
|
||||
|
||||
info = Imgur.upload_file(file)
|
||||
|
||||
Upload.create!({
|
||||
user_id: user_id,
|
||||
topic_id: topic_id,
|
||||
original_filename: file.original_filename
|
||||
}.merge!(info))
|
||||
end
|
||||
|
||||
# Store uploads on s3
|
||||
def self.create_on_s3(user_id, file, topic_id)
|
||||
@fog_loaded = require 'fog' unless @fog_loaded
|
||||
|
||||
tempfile = file.tempfile
|
||||
|
||||
upload = Upload.new(user_id: user_id,
|
||||
topic_id: topic_id,
|
||||
filesize: File.size(tempfile),
|
||||
original_filename: file.original_filename)
|
||||
|
||||
image_info = FastImage.new(tempfile, raise_on_failure: true)
|
||||
blob = file.read
|
||||
sha1 = Digest::SHA1.hexdigest(blob)
|
||||
remote_filename = "#{sha1}.#{image_info.type}"
|
||||
|
||||
fog = Fog::Storage.new(
|
||||
aws_access_key_id: SiteSetting.s3_access_key_id,
|
||||
aws_secret_access_key: SiteSetting.s3_secret_access_key,
|
||||
region: SiteSetting.s3_region,
|
||||
provider: 'AWS'
|
||||
)
|
||||
|
||||
directory = fog.directories.create(key: SiteSetting.s3_upload_bucket)
|
||||
|
||||
file = directory.files.create(
|
||||
key: remote_filename,
|
||||
body: tempfile,
|
||||
public: true,
|
||||
content_type: file.content_type
|
||||
)
|
||||
|
||||
upload.width, upload.height = ImageSizer.resize(*image_info.size)
|
||||
upload.url = "//#{SiteSetting.s3_upload_bucket}.s3-#{SiteSetting.s3_region}.amazonaws.com/#{remote_filename}"
|
||||
|
||||
upload.save
|
||||
|
||||
upload
|
||||
end
|
||||
|
||||
def self.create_locally(user_id, file, topic_id)
|
||||
upload = Upload.create!({
|
||||
user_id: user_id,
|
||||
topic_id: topic_id,
|
||||
url: "",
|
||||
original_filename: file.original_filename,
|
||||
filesize: File.size(file.tempfile),
|
||||
original_filename: file.original_filename
|
||||
width: width,
|
||||
height: height,
|
||||
url: ""
|
||||
})
|
||||
|
||||
# populate the rest of the info
|
||||
clean_name = Digest::SHA1.hexdigest("#{Time.now.to_s}#{file.original_filename}")[0,16]
|
||||
image_info = FastImage.new(file.tempfile, raise_on_failure: true)
|
||||
clean_name += ".#{image_info.type}"
|
||||
url_root = "/uploads/#{RailsMultisite::ConnectionManagement.current_db}/#{upload.id}"
|
||||
path = "#{Rails.root}/public#{url_root}"
|
||||
# make sure we're at the beginning of the file (FastImage is moving the pointer)
|
||||
file.rewind
|
||||
|
||||
FileUtils.mkdir_p path
|
||||
# not using cause mv, cause permissions are no good on move
|
||||
File.open("#{path}/#{clean_name}", "wb") do |f|
|
||||
f.write File.read(file.tempfile)
|
||||
end
|
||||
|
||||
upload.width, upload.height = ImageSizer.resize(*image_info.size)
|
||||
upload.url = Discourse::base_uri + "#{url_root}/#{clean_name}"
|
||||
# store the file and update its url
|
||||
upload.url = Upload.store_file(file, image_info, upload.id)
|
||||
|
||||
upload.save
|
||||
|
||||
upload
|
||||
end
|
||||
|
||||
def self.store_file(file, image_info, upload_id)
|
||||
return Imgur.store_file(file, image_info, upload_id) if SiteSetting.enable_imgur?
|
||||
return S3.store_file(file, image_info, upload_id) if SiteSetting.enable_s3_uploads?
|
||||
return LocalStore.store_file(file, image_info, upload_id)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
# == Schema Information
|
||||
@@ -119,4 +66,3 @@ end
|
||||
# index_uploads_on_forum_thread_id (topic_id)
|
||||
# index_uploads_on_user_id (user_id)
|
||||
#
|
||||
|
||||
|
||||
Reference in New Issue
Block a user