mirror of
https://github.com/discourse/discourse.git
synced 2024-11-23 20:20:43 +08:00
cbef844a57
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.
64 lines
1.5 KiB
Ruby
64 lines
1.5 KiB
Ruby
# 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 |