|
|
|
@@ -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
|
|
|
|
|