解压zip改变相对路劲到绝对路劲



def handle_zip(origin_name, user_id)
if self.image_url=~ /\.zip$/i
begin
folder = origin_name.gsub('.zip', '') if origin_name.present?
dirname = "#{Rails.root}/public/upload_files/a03/html5/#{self.id}"
userid_name = "#{Rails.root}/public/upload_files/temp_zip/#{user_id}"
replaced_url = "http://a03.optimix.asia/html5/#{self.id}"
FileUtils.mkdir_p(dirname) unless File.directory?(dirname)
%x(rm -rf #{dirname}/*)
%x(cp -r #{userid_name}/* #{dirname})
%x(chown xmo:xmo -R #{dirname}) if Rails.env.production?

unless File.exist?("#{userid_name}/index.html")
folder = Dir.entries("#{userid_name}").select{|dir| ![".",".."].include?(dir)}.last.to_s
File.rename("#{dirname}/#{folder}","#{dirname}/html5_assets")
folder = "html5_assets"
end

%x(rm -rf #{userid_name})
read_list_path = File.directory?("#{dirname}/#{folder}") ? "#{dirname}/#{folder}" : dirname
replaced_url = File.directory?("#{dirname}/#{folder}") ? "#{replaced_url}/#{folder}" : replaced_url
ab_index_url = File.directory?("#{dirname}/#{folder}") ? "#{dirname}/#{folder}/index.html" : "#{dirname}/index.html"

sign = read_list_path =~ /#{self.id.to_s}$/ ? self.id.to_s : folder
all_urls = get_file_list(read_list_path, self.id.to_s, folder, sign)
replace_url = all_urls.select{|url| url.downcase =~ /\.(gif|jpg|jpeg|png|js|css)$/i}
all_js_path = replace_url.select{|url| url.downcase =~ /\.js$/i}

replace_js_files(dirname,folder,all_js_path,replace_url,replaced_url)
replace_html_file(ab_index_url, replace_url, replaced_url)

rescue
return {"status" => "invalid" , "message" => 'please reupload zip'}
end
end
end

def get_urls_from_js(js,directory)
reg = /\"([^\"\']+\.(png|gif|jpg|jpeg|js|css))\"|\'([^\'\"]+\.(png|gif|jpg|jpeg|js|css))\'/
urls = js.scan(reg).map{|b| b[0].present? ? b[0] : b[2]}.uniq
urls.present? ? sort_url(urls.select{|url| directory.any?{|dir| dir.include?(url.gsub(/\.(\.|)\//,''))}}) : []
end

def replace_js_files(dirname,folder,all_js_path,replace_url,replaced_url)
all_js_path.each do |path|
js_pathname = File.directory?("#{dirname}/#{folder}") ? "#{dirname}/#{folder}/#{path}" : "#{dirname}/#{path}"
file = File.open(js_pathname)
js = file.read
js_urls_from_file = get_urls_from_js(js.gsub(/\s+/,''), replace_url)
js_urls_from_file.each {|url|
path1 = path.split('/')
(url.scan(/\.\.\//).count + 1).times {path1.pop}
root_url = path1.push(url.gsub(/\.(\.|)\//,'').gsub('.', '00replace00')).join('/')
js = js.gsub(url,"#{replaced_url}/#{root_url}")
}
File.open(js_pathname, "w") { |fw| fw.write(js.gsub('00replace00', '.'))} if js_urls_from_file.present?
end
end

def replace_html_file(ab_index_url, replace_url, replaced_url)
file = File.open(ab_index_url)
html = file.read
replace_url.each{|r| html = html.gsub("./#{r}","#{replaced_url}/#{r.gsub('.','00replace00')}").gsub(r,"#{replaced_url}/#{r}").gsub('00replace00','.')}
File.open(ab_index_url, "w") { |fw| fw.write(html) }
self.update_attributes(:h5_code => html)
end

def sort_url(urls)
urls1 = urls.select{|url| url.match(/\.(\.|)\//)}
sort_has_point(urls1) + (urls - urls1).sort{|x,y| y.scan(/\//).count <=> x.scan(/\//).count}
end

def sort_has_point(urls)
urls.sort{|x,y|
if x.scan(/\.(\.|)\//).count > 0 && x.scan(/\.(\.|)\//).count == y.scan(/\.(\.|)\//).count
x.scan(/\.\.\//).count > y.scan(/\.\.\//).count ? -1 : 1
else
y.scan(/\.(\.|)\//).count <=> x.scan(/\.(\.|)\//).count
end
}
end

def verification_zip(origin_name,user_id)
message = []
begin
folder = origin_name.gsub('.zip', '') if origin_name.present?
pathname = "#{Rails.root}/public/upload_files/a03/#{self.image_url.gsub(/http:\/\/a03.optimix.asia\//, '')}"
userid_name = "#{Rails.root}/public/upload_files/temp_zip/#{user_id}"
FileUtils.mkdir_p(userid_name) unless File.directory?(userid_name)
return {"status" => "invalid" , "message" => I18n.t('pretargetings.validate.html5_too_large') } if File.size("#{pathname}").to_i/1024 > ZIP_MAX_SIZE

%x(rm -rf #{userid_name}/*)
%x(unzip -o -d #{userid_name} #{pathname})
%x(rm -rf #{userid_name}/__MACOSX) if File.directory?("#{userid_name}/__MACOSX")

directory = Dir.entries("#{userid_name}").select{|dir| ![".",".."].include?(dir)}
index_html = directory.select{|dir| dir =~ /\.html$/ }
if index_html.present?
File.rename("#{userid_name}/#{index_html.last}", "#{userid_name}/index.html")
else
folder = directory.last
dire = Dir.entries("#{userid_name}/#{folder}").select{|dir| dir =~ /\.html$/}
File.rename("#{userid_name}/#{folder}/#{dire.last}", "#{userid_name}/#{folder}/index.html")
end

read_list_path = File.directory?("#{userid_name}/#{folder}") ? "#{userid_name}/#{folder}" : userid_name
ab_index_url = File.directory?("#{userid_name}/#{folder}") ? "#{userid_name}/#{folder}/index.html" : "#{userid_name}/index.html"

ve = verification_html(ab_index_url)
message << ve["message"] if ve.is_a?(Hash) && ve["status"] == "invalid"

sign = read_list_path =~ /#{user_id.to_s}$/ ? user_id.to_s : folder
all_urls = get_file_list(read_list_path, user_id.to_s, folder, sign)

ve = verification_file_type(all_urls,ab_index_url)
message << ve["message"] if ve.is_a?(Hash) && ve["status"] == "invalid"

ve = verification_head_size(ab_index_url,self.size)
message << ve["message"] if ve.is_a?(Hash) && ve["status"] == "invalid"
message.present? ? {"status" => "invalid" , "message" => message.join('</p>')} : true
rescue
return {"status" => "invalid" , "message" => 'please reupload zip'}
end
end

def get_file_list(path, id, folder=nil,sign="0")
b = []
Dir.entries(path).each do |sub|
if sub != '.' && sub != '..'
if File.directory?("#{path}/#{sub}")
b = b + get_file_list("#{path}/#{sub}", id, folder, sign)
end
b << (path + '/' + sub).split(sign + '/')[1] unless File.directory?("#{path}/#{sub}")
end
end
b
end

def verification_html(path)
File.open(path) do |fr|
xml = fr.read
match_data = xml.gsub(/\s+/,'').match(/<metaname=(\"|\')ad\.size(\"|\')content=(\"|\')width=\d+,height=\d+(\"|\')(\/|)>/i)
unless match_data.present? && xml =~ /\$clickurl\$/i && xml =~ /\<\!DOCTYPE html\>/i && xml =~ /\<html/i && xml =~ /\<body/i && xml =~ /\<\/body\>/i && xml =~ /\<\/html\>/i
{"status" => "invalid" , "message" => I18n.t('pretargetings.validate.please_upload_effective_material') }
end
end
end

def verification_file_type(array,path)

if array.any?{|item| item.downcase =~ /\.(bmp|pcx|tiff|tga|exif|fpx|svg|psd|cdr|pcd|dxf|ufo|eps|ai|hdri|raw)$/}
{"status" => "invalid" , "message" => I18n.t('pretargetings.validate.image_Format_error') }
end
if array.any?{|item| item.downcase =~ /\.json$/}
{"status" => "invalid" , "message" => I18n.t('pretargetings.validate.please_upload_effective_material') }
end
end

def verification_head_size(path,size)
selected_size = size.split('*')
File.open(path) do |fr|
xml=fr.read.gsub(/\s+/,'')
match_data = xml.match(/<metaname=(\"|\')ad\.size(\"|\')content=(\"|\')width=\d+,height=\d+(\"|\')(\/|)>/i)
{"status" => "invalid" , "message" => I18n.t('pretargetings.validate.size_Format_error') } if match_data.present? && match_data.to_s.scan(/\d+/) != selected_size
end
end

下一步读取数据库的index.html代码显示。
http://www.schooltop.net/blogs/179
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值