mirror of
https://github.com/discourse/discourse.git
synced 2025-02-25 18:55:32 -06:00
Build out a URI Adapter to allow uploading an avatar via a url
Currently only really accessible via the API. The UriAdapter creates a tempfile from a url and gives a ActionDispatch::HTTP::UploadedFile back to the controller to process as normal. This will help a lot in being able to transfer avatar urls from another app without monkey patching a lot of discourse code.
This commit is contained in:
64
app/services/uri_adapter.rb
Normal file
64
app/services/uri_adapter.rb
Normal file
@@ -0,0 +1,64 @@
|
||||
# For converting urls to files
|
||||
class UriAdapter
|
||||
|
||||
attr_reader :target, :content, :tempfile, :original_filename
|
||||
|
||||
def initialize(target)
|
||||
raise Discourse::InvalidParameters unless target =~ /^https?:\/\//
|
||||
|
||||
@target = URI(target)
|
||||
@original_filename = ::File.basename(@target.path)
|
||||
@content = download_content
|
||||
@tempfile = TempfileFactory.new.generate(@original_filename)
|
||||
end
|
||||
|
||||
def download_content
|
||||
open(target)
|
||||
end
|
||||
|
||||
def copy_to_tempfile(src)
|
||||
while data = src.read(16*1024)
|
||||
tempfile.write(data)
|
||||
end
|
||||
src.close
|
||||
tempfile.rewind
|
||||
tempfile
|
||||
end
|
||||
|
||||
def file_size
|
||||
content.size
|
||||
end
|
||||
|
||||
def build_uploaded_file
|
||||
return if (SiteSetting.max_image_size_kb * 1024) < file_size
|
||||
|
||||
copy_to_tempfile(content)
|
||||
content_type = content.content_type if content.respond_to?(:content_type)
|
||||
content_type ||= "text/html"
|
||||
|
||||
ActionDispatch::Http::UploadedFile.new( tempfile: tempfile,
|
||||
filename: original_filename,
|
||||
type: content_type
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
# From https://github.com/thoughtbot/paperclip/blob/master/lib/paperclip/tempfile_factory.rb
|
||||
class TempfileFactory
|
||||
ILLEGAL_FILENAME_CHARACTERS = /^~/
|
||||
|
||||
def generate(name)
|
||||
@name = name
|
||||
file = Tempfile.new([basename, extension])
|
||||
file.binmode
|
||||
file
|
||||
end
|
||||
|
||||
def extension
|
||||
File.extname(@name)
|
||||
end
|
||||
|
||||
def basename
|
||||
File.basename(@name, extension).gsub(ILLEGAL_FILENAME_CHARACTERS, '_')
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user