修复:处理禅道图片函数

This commit is contained in:
yystopf 2024-09-13 13:48:26 +08:00
parent 4fbbe88ca9
commit 0d1ca7bc49
2 changed files with 92 additions and 71 deletions

View File

@ -1,44 +1,44 @@
# == Schema Information
#
# Table name: attachments
#
# id :integer not null, primary key
# container_id :integer
# container_type :string(30)
# filename :string(255) default(""), not null
# disk_filename :string(255) default(""), not null
# filesize :integer default("0"), not null
# content_type :string(255) default("")
# digest :string(60) default(""), not null
# downloads :integer default("0"), not null
# author_id :integer default("0"), not null
# created_on :datetime
# description :text(65535)
# disk_directory :string(255)
# attachtype :integer default("1")
# is_public :integer default("1")
# copy_from :integer
# quotes :integer default("0")
# is_publish :integer default("1")
# publish_time :datetime
# resource_bank_id :integer
# unified_setting :boolean default("1")
# cloud_url :string(255) default("")
# course_second_category_id :integer default("0")
# delay_publish :boolean default("0")
# uuid :string(255)
#
# Indexes
#
# index_attachments_on_author_id (author_id)
# index_attachments_on_container_id_and_container_type (container_id,container_type)
# index_attachments_on_course_second_category_id (course_second_category_id)
# index_attachments_on_created_on (created_on)
# index_attachments_on_is_public (is_public)
# index_attachments_on_quotes (quotes)
# index_attachments_on_uuid (uuid)
#
# == Schema Information
#
# Table name: attachments
#
# id :integer not null, primary key
# container_id :integer
# container_type :string(30)
# filename :string(255) default(""), not null
# disk_filename :string(255) default(""), not null
# filesize :integer default("0"), not null
# content_type :string(255) default("")
# digest :string(60) default(""), not null
# downloads :integer default("0"), not null
# author_id :integer default("0"), not null
# created_on :datetime
# description :text(65535)
# disk_directory :string(255)
# attachtype :integer default("1")
# is_public :integer default("1")
# copy_from :integer
# quotes :integer default("0")
# is_publish :integer default("1")
# publish_time :datetime
# resource_bank_id :integer
# unified_setting :boolean default("1")
# cloud_url :string(255) default("")
# course_second_category_id :integer default("0")
# delay_publish :boolean default("0")
# uuid :string(255)
#
# Indexes
#
# index_attachments_on_author_id (author_id)
# index_attachments_on_container_id_and_container_type (container_id,container_type)
# index_attachments_on_course_second_category_id (course_second_category_id)
# index_attachments_on_created_on (created_on)
# index_attachments_on_is_public (is_public)
# index_attachments_on_quotes (quotes)
# index_attachments_on_uuid (uuid)
#
@ -76,6 +76,42 @@ class Attachment < ApplicationRecord
DCODES = %W(2 3 4 5 6 7 8 9 a b c f e f g h i j k l m n o p q r s t u v w x y z)
def self.build_from_remote_url(user, name, url, container=nil)
ext = name.split('.')[-1]
tmp_path = "#{Rails.root}/#{name}"
uri = URI(url)
size = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') do |http|
response = http.get(uri.path)
File.open(tmp_path, 'wb') do |file|
file.write(response.body)
end
end
digest = "#{Digest::MD5.file(tmp_path).hexdigest}_#{(Time.now.to_f * 1000).to_i}.#{ext}"
month_folder = "#{Time.now.year}/#{Time.now.month.to_s.rjust(2, '0')}"
save_path = "#{Rails.root}#{EduSetting.get("attachment_folder")}#{month_folder}"
unless Dir.exists?(save_path)
FileUtils.mkdir_p(save_path) ##不成功这里会抛异常
end
path = File.join(save_path, digest)
FileUtils.mv(tmp_path, path)
attachment = Attachment.new
attachment.filename = name
attachment.disk_filename = path[save_path.size+1, path.size]
attachment.filesize = size
attachment.content_type = 'application/octet-stream'
attachment.digest = digest.split('.')[0]
attachment.author_id = user.id
attachment.disk_directory = month_folder
attachment.cloud_url = url
attachment.uuid = SecureRandom.uuid
attachment.container = container
attachment.save!
return attachment
rescue
return nil
end
def diskfile
File.join(File.join(Rails.root, "files"), disk_directory.to_s, disk_filename.to_s)
end

View File

@ -23,39 +23,24 @@ namespace :import_from_chandao do
return nil
end
def get_chandao_json(api_url)
url = URI("#{EduSetting.get("chandao_server_url")}#{api_url}")
http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Post.new(url)
request["Cookie"] = "zentaosid=#{EduSetting.get("chandao_sid")}"
response = http.request(request)
response.read_body
return JSON.parse(JSON.parse(response.read_body)['data'])
rescue
return {}
end
def trans_content_img(content, user)
respace_content_arr = content.to_s.scan(/<img\s+[^>]*?src=[“.*?“][^>]*?\/?>/).map{|s|[s,s.match(/(\d+\.\w+)/)[0].split(".")[0],s.match(/(\d+\.\w+)/)[0].split(".")[1]]}
respace_content_arr.each do |img|
remote_image_url = "#{EduSetting.get("chandao_server_url")}/file-read-#{img[1]}.json"
tmp_local_image_path = "#{Rails.root}/#{img[1..2].join(".")}"
uri = URI(remote_image_url)
size = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') do |http|
response = http.get(uri.path)
File.open(tmp_local_image_path, 'wb') do |file|
file.write(response.body)
end
end
digest = "#{Digest::MD5.file(tmp_local_image_path).hexdigest}_#{(Time.now.to_f * 1000).to_i}.#{img[2]}"
month_folder = "#{Time.now.year}/#{Time.now.month.to_s.rjust(2, '0')}"
save_path = "#{Rails.root}#{EduSetting.get("attachment_folder")}#{month_folder}"
unless Dir.exists?(save_path)
FileUtils.mkdir_p(save_path) ##不成功这里会抛异常
end
local_image_path = File.join(save_path, digest)
FileUtils.mv(tmp_local_image_path, local_image_path)
attachment = Attachment.new
attachment.filename = img[1..2].join(".")
attachment.disk_filename = local_image_path[save_path.size+1, local_image_path.size]
attachment.filesize = size
attachment.content_type = img[2]
attachment.digest = digest
attachment.author_id = user.id
attachment.disk_directory = month_folder
attachment.cloud_url = remote_image_url
attachment.uuid = SecureRandom.uuid
attachment.save
attachment = Attachment.build_from_remote_url(user, img[1..2].join("."), remote_image_url)
att_url = "#{Rails.application.config_for(:configuration)['platform_url']}/api/attachments/#{attachment.uuid}"
content.gsub!(img[0], "![](#{att_url})")
end
@ -89,7 +74,7 @@ namespace :import_from_chandao do
issue.project_issues_index = randd_field_hash['Bug编号'].to_i
issue.status_id = trans_status(randd_field_hash['Bug状态']) || IssueStatus.first.id
issue.tracker_id = Tracker.first.id
issue.priority_id = randd_field_hash['优先级'].to_i
issue.priority_id = randd_field_hash['优先级'].split('P')[-1].to_i rescue 1
issue.subject = randd_field_hash['Bug标题']
issue.description = trans_content_img(randd_field_hash['重现步骤'].to_s, author)
issue.created_on = randd_field_hash['创建日期'].to_time rescue nil