Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Gemfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
source 'http://ruby.taobao.org/'
source 'https://ruby.taobao.org/'

# Specify your gem's dependencies in file-part-upload.gemspec
gemspec
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -263,4 +263,12 @@ lan_qiniu_compatibility_mode_upload_url: http://up.kc_file_upload.com
= javascript_include_tag :application, :'data-turbolinks-track' => true
```

# postgresql 如何使用方法
## migrate
```
# 生成所需数据表
rails g active_record:file_part_upload whatever
rake db:migrate
```

其余使用方法同上
52 changes: 52 additions & 0 deletions app/models/concerns/file_part_upload/file_entity_active_record.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
module FilePartUpload
module FileEntityActiveRecord
extend ActiveSupport::Concern

KINDS = [:image, :audio, :video, :application, :text, :office, :pdf]
included do
extend Enumerize

include FilePartUpload::QiniuValidate
include FilePartUpload::QiniuCreateMethods
include FilePartUpload::QiniuMethods

# image video office
# field :kind, type: String
enumerize :kind, in: KINDS

validates :original, :presence => true
validates :file_size, :presence => true
validates :mime, :presence => true
validates :kind, :presence => true
end

class_methods do
end

# 获取文件大小
def file_size
meta_json["file_size"]
end

def file_size=(p_file_size)
tmp = meta_json
tmp["file_size"] = p_file_size.to_i
self.meta = tmp.to_json
end

KINDS.each do |kind_sym|
define_method "is_#{kind_sym}?" do
self.kind.to_s == kind_sym.to_s
end
end

def meta_json
if meta.blank?
{}
else
JSON.parse meta
end
end

end
end
66 changes: 66 additions & 0 deletions app/models/concerns/file_part_upload/file_entity_mongoid.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
module FilePartUpload
module FileEntityMongoid
extend ActiveSupport::Concern

KINDS = [:image, :audio, :video, :application, :text, :office, :pdf]

included do
include Mongoid::Document
include Mongoid::Timestamps
extend Enumerize

include FilePartUpload::QiniuValidate
include FilePartUpload::QiniuCreateMethods
include FilePartUpload::QiniuMethods

# 原始文件名
field :original, type: String
# content_type
field :mime, type: String
# image video office
# field :kind, type: String
enumerize :kind, in: KINDS

# 本地模式 时, 表示 保存的文件名
# qiniu模式 时, 表示 文件在七牛 bucket 中保存的 token(path)
field :token, type: String

# 保存文件的 meta 信息
# 所有文件都会有 {"file_size" => 1000}
# 具体特定文件的 meta 信息格式待确定
field :meta, type: Hash

# 只用于 本地模式
# 表示已经保存的文件片段的大小
field :saved_size, type: Integer

# 只用于 本地模式
# 表示是否已经把文件片段合并
field :merged, type: Boolean, default: false


validates :original, :presence => true
validates :file_size, :presence => true
validates :mime, :presence => true
validates :kind, :presence => true
end

# 获取文件大小
def file_size
self.meta["file_size"]
end

def file_size=(file_size)
self.meta = {} if self.meta.blank?
self.meta["file_size"] = file_size.to_i
end

KINDS.each do |kind_sym|
define_method "is_#{kind_sym}?" do
self.kind.to_s == kind_sym.to_s
end
end


end
end
29 changes: 18 additions & 11 deletions app/models/concerns/file_part_upload/qiniu_create_methods.rb
Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
module FilePartUpload
module QiniuCreateMethods
def self.included(base)
base.send(:extend, ClassMethods)
end

module ClassMethods
extend ActiveSupport::Concern

class_methods do
# { "bucket"=>"fushang318",
# "token"=>"/i/yscPYbwk.jpeg",
# "file_size"=>"3514",
Expand All @@ -27,17 +24,27 @@ module ClassMethods
# "avinfo_audio_duration" => ""
# }
def from_qiniu_callback_body(callback_body)

qiniu_base_path = FilePartUpload.get_qiniu_base_path

callback_body[:file_size] = callback_body[:file_size].to_i
meta = __get_meta_from_callback_body(callback_body[:mime], callback_body)

FilePartUpload::FileEntity.create!(
original: callback_body[:original],
token: callback_body[:token],
mime: callback_body[:mime],
meta: meta
)
if defined? ::ActiveRecord::Base
FilePartUpload::FileEntity.create!(
original: callback_body[:original],
token: callback_body[:token],
mime: callback_body[:mime],
meta: meta.to_json
)
else
FilePartUpload::FileEntity.create!(
original: callback_body[:original],
token: callback_body[:token],
mime: callback_body[:mime],
meta: meta
)
end
end


Expand Down
17 changes: 9 additions & 8 deletions app/models/concerns/file_part_upload/qiniu_methods.rb
Original file line number Diff line number Diff line change
Expand Up @@ -64,10 +64,6 @@ def seconds
meta.try(:[], self.kind.to_s).try(:[], "total_duration").to_i
end

def file_size
meta["file_size"]
end

def url(version = nil)
base_url = File.join(FilePartUpload.get_qiniu_domain, token)

Expand Down Expand Up @@ -116,11 +112,16 @@ def put_video_transcode_to_quene
# 参考了 http://www.lecloud.com/

# 从七牛获取的 video_bit_rate 有时候是空,所以用 total_bit_rate 稳妥一些
video_bit_rate = self.meta["video"]["total_bit_rate"].to_i
video_width = self.meta["video"]["width"].to_i
video_height = self.meta["video"]["height"].to_i
if defined? ::ActiveRecord::Base
json = meta_json
else
json = meta
end
video_bit_rate = json["video"]["total_bit_rate"].to_i
video_width = json["video"]["width"].to_i
video_height = json["video"]["height"].to_i

video_codec_name = self.meta["video"]["video_codec_name"]
video_codec_name = json["video"]["video_codec_name"]

mulriple = VIDEO_BIT_RATE_MULRIPLES.select do |hash|
!video_codec_name.match(hash[:video_codec_name]).blank?
Expand Down
30 changes: 21 additions & 9 deletions app/models/concerns/file_part_upload/qiniu_validate.rb
Original file line number Diff line number Diff line change
@@ -1,18 +1,30 @@
module FilePartUpload
module QiniuValidate
def self.included(base)
base.before_validation :set_kind_by_mime
extend ActiveSupport::Concern
included do
before_validation :set_kind_by_mime
end

def set_kind_by_mime
if defined? ::ActiveRecord::Base
if self.mime.present?
new_kind = FilePartUpload::Util.get_file_kind_by_mime_type(self.mime)
self.kind = new_kind if new_kind != self.kind
# 七牛的 mime 有时候有问题,比如 mpg 格式的视频,七牛会识别成 audio/mpeg
# 这个情况通过 meta 字段信息 fix
self.kind = "video" if !meta_json["video"].blank? && self.kind != "video"
self.kind = "audio" if !meta_json["audio"].blank? && self.kind != "audio"
end

if self.mime.present?
new_kind = FilePartUpload::Util.get_file_kind_by_mime_type(self.mime)
self.kind = new_kind if new_kind != self.kind
# 七牛的 mime 有时候有问题,比如 mpg 格式的视频,七牛会识别成 audio/mpeg
# 这个情况通过 meta 字段信息 fix
self.kind = "video" if !self.meta["video"].blank? && self.kind != "video"
self.kind = "audio" if !self.meta["audio"].blank? && self.kind != "audio"
else
if self.mime.present?
new_kind = FilePartUpload::Util.get_file_kind_by_mime_type(self.mime)
self.kind = new_kind if new_kind != self.kind
# 七牛的 mime 有时候有问题,比如 mpg 格式的视频,七牛会识别成 audio/mpeg
# 这个情况通过 meta 字段信息 fix
self.kind = "video" if !self.meta["video"].blank? && self.kind != "video"
self.kind = "audio" if !self.meta["audio"].blank? && self.kind != "audio"
end
end
end

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
module FilePartUpload
module TranscodingRecordActiveRecord
extend ActiveSupport::Concern
included do
extend Enumerize

enumerize :status, in: [:processing, :success, :failure], default: :processing

belongs_to :file_entity, class_name: 'FilePartUpload::FileEntity'

before_create :send_to_qiniu_queue
before_save :put_pdf_transcode_to_quene
before_save :record_image_size_by_token_on_transcode_success
end

def send_to_qiniu_queue
self.quniu_persistance_id = FilePartUpload::Util.put_to_qiniu_transcode_queue(
self.file_entity.token,
self.fops
)
end

def put_pdf_transcode_to_quene
return true if !self.file_entity.is_office? || self.name != "pdf" || !self.status.success?

self.file_entity.update_page_count_by_pdf_url(self.url)
self.file_entity.put_pdf_transcode_to_quene_by_page_count
end

def record_image_size_by_token_on_transcode_success
return true if (!self.file_entity.is_office? && !self.file_entity.is_pdf?) || self.name != "jpg" || !self.status.success?

json_str = RestClient.get("#{self.url}?imageInfo").body
self.file_entity.meta["page_width"] = JSON.parse(json_str)["width"].to_i
self.file_entity.meta["page_height"] = JSON.parse(json_str)["height"].to_i
self.file_entity.save
end

def url
File.join(FilePartUpload.get_qiniu_domain, [*token][0])
end

def urls
[*token].map do |t|
File.join(FilePartUpload.get_qiniu_domain, t)
end
end

def refresh_status_form_qiniu
code = FilePartUpload::Util.get_qiniu_transcode_status(self.quniu_persistance_id)
update_status_by_code(code)
end

def update_status_by_code(code)
# 状态码0成功,1等待处理,2正在处理,3处理失败,4通知提交失败。
case code
when 0,4
self.status = :success
when 1,2
self.status = :processing
when 3
self.status = :failure
end

if self.changed.include?("status")
self.save
end
end

end
end
Loading