mirror of
https://github.com/discourse/discourse.git
synced 2025-02-12 22:34:57 +00:00
This reduces chances of errors where consumers of strings mutate inputs and reduces memory usage of the app. Test suite passes now, but there may be some stuff left, so we will run a few sites on a branch prior to merging
78 lines
2.3 KiB
Ruby
78 lines
2.3 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require_dependency 'url_helper'
|
|
require_dependency 'file_helper'
|
|
|
|
module ImportScripts
|
|
class Uploader
|
|
include ActionView::Helpers::NumberHelper
|
|
|
|
# Creates an upload.
|
|
# Expects path to be the full path and filename of the source file.
|
|
# @return [Upload]
|
|
def create_upload(user_id, path, source_filename)
|
|
tmp = copy_to_tempfile(path)
|
|
|
|
UploadCreator.new(tmp, source_filename).create_for(user_id)
|
|
rescue => e
|
|
STDERR.puts "Failed to create upload: #{e}"
|
|
nil
|
|
ensure
|
|
tmp.close rescue nil
|
|
tmp.unlink rescue nil
|
|
end
|
|
|
|
def create_avatar(user, avatar_path)
|
|
tempfile = copy_to_tempfile(avatar_path)
|
|
filename = "avatar#{File.extname(avatar_path)}"
|
|
upload = UploadCreator.new(tempfile, filename, type: "avatar").create_for(user.id)
|
|
|
|
if upload.present? && upload.persisted?
|
|
user.create_user_avatar
|
|
user.user_avatar.update(custom_upload_id: upload.id)
|
|
user.update(uploaded_avatar_id: upload.id)
|
|
else
|
|
STDERR.puts "Failed to upload avatar for user #{user.username}: #{avatar_path}"
|
|
STDERR.puts upload.errors.inspect if upload
|
|
end
|
|
rescue
|
|
STDERR.puts "Failed to create avatar for user #{user.username}: #{avatar_path}"
|
|
ensure
|
|
tempfile.close! if tempfile
|
|
end
|
|
|
|
def html_for_upload(upload, display_filename)
|
|
if FileHelper.is_supported_image?(upload.url)
|
|
embedded_image_html(upload)
|
|
else
|
|
attachment_html(upload, display_filename)
|
|
end
|
|
end
|
|
|
|
def embedded_image_html(upload)
|
|
image_width = [upload.width, SiteSetting.max_image_width].compact.min
|
|
image_height = [upload.height, SiteSetting.max_image_height].compact.min
|
|
upload_name = upload.short_url || upload.url
|
|
%Q~![#{upload.original_filename}|#{image_width}x#{image_height}](#{upload_name})~
|
|
end
|
|
|
|
def attachment_html(upload, display_filename)
|
|
"<a class='attachment' href='#{upload.url}'>#{display_filename}</a> (#{number_to_human_size(upload.filesize)})"
|
|
end
|
|
|
|
private
|
|
|
|
def copy_to_tempfile(source_path)
|
|
extension = File.extname(source_path)
|
|
tmp = Tempfile.new(['discourse-upload', extension])
|
|
|
|
File.open(source_path) do |source_stream|
|
|
IO.copy_stream(source_stream, tmp)
|
|
end
|
|
|
|
tmp.rewind
|
|
tmp
|
|
end
|
|
end
|
|
end
|