|  |  | class ZipdownController < ApplicationController
 | 
						
						
						
							|  |  |   SAVE_FOLDER = "#{Rails.root}/files"
 | 
						
						
						
							|  |  |   OUTPUT_FOLDER = "#{Rails.root}/tmp/archiveZip"
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |   def assort
 | 
						
						
						
							|  |  |     obj_class = params[:obj_class]
 | 
						
						
						
							|  |  |     obj_id = params[:obj_id]
 | 
						
						
						
							|  |  |     obj = obj_class.constantize.find(obj_id)
 | 
						
						
						
							|  |  |     zipfile = nil
 | 
						
						
						
							|  |  |     case obj.class.to_s.to_sym
 | 
						
						
						
							|  |  |       when :Bid
 | 
						
						
						
							|  |  |         zipfile = zip_bid obj
 | 
						
						
						
							|  |  |       else
 | 
						
						
						
							|  |  |         logger.error "[ZipDown#assort] ===> #{obj.class.to_s.to_sym} unKown !!"
 | 
						
						
						
							|  |  |     end
 | 
						
						
						
							|  |  |     send_file zipfile, :filename => obj.name, :type => detect_content_type(zipfile) if zipfile
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |   #rescue NameError, ActiveRecord::RecordNotFound => e
 | 
						
						
						
							|  |  |     #logger.error "[ZipDown] ===> #{e}"
 | 
						
						
						
							|  |  |     #@error = e
 | 
						
						
						
							|  |  |   end
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |   private
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |   def zip_bid(bid)
 | 
						
						
						
							|  |  |     # Todo: User Access Controll
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |     homeattaches = bid.homeworks
 | 
						
						
						
							|  |  |     # 得到每一个人所有文件打包的zip文件
 | 
						
						
						
							|  |  |     # 并将每一个人的zip打包为一个并返回路径
 | 
						
						
						
							|  |  |     user_zip_paths = homeattaches.map do |homeattach|
 | 
						
						
						
							|  |  |       zip_homework_by_user homeattach
 | 
						
						
						
							|  |  |     end
 | 
						
						
						
							|  |  |     zipping "#{Time.now.to_i}_#{bid.name}.zip", user_zip_paths, OUTPUT_FOLDER
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |     #@paths = homeworks_attach_path
 | 
						
						
						
							|  |  |     #zipfile = ziping homeworks_attach_path
 | 
						
						
						
							|  |  |     #send_file zipfile, :filename => bid.name,
 | 
						
						
						
							|  |  |     #          :type => detect_content_type(zipfile)
 | 
						
						
						
							|  |  |     #rescue Errno::ENOENT => e
 | 
						
						
						
							|  |  |     #  logger.error "[Errno::ENOENT] ===> #{e}"
 | 
						
						
						
							|  |  |     #  @error = e
 | 
						
						
						
							|  |  |   end
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |   def zip_homework_by_user(homeattach)
 | 
						
						
						
							|  |  |     homeworks_attach_path = []
 | 
						
						
						
							|  |  |     # 需要将所有homework.attachments遍历加入zip
 | 
						
						
						
							|  |  |     # 并且返回zip路径
 | 
						
						
						
							|  |  |     user_attaches_paths = homeattach.attachments.each do |attach|
 | 
						
						
						
							|  |  |       #length = attach.storage_path.length
 | 
						
						
						
							|  |  |       homeworks_attach_path << attach.diskfile#.to_s.slice((length+1)..-1)
 | 
						
						
						
							|  |  |     end
 | 
						
						
						
							|  |  |     zipping "#{Time.now.to_i}_#{homeattach.user.name.to_s}.zip", homeworks_attach_path, OUTPUT_FOLDER, true
 | 
						
						
						
							|  |  |   end
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |   def zipping(zip_name_refer, files_paths, output_path, is_attachment=false)
 | 
						
						
						
							|  |  |     # 输入待打包的文件列表,已经打包文件定位到ouput_path
 | 
						
						
						
							|  |  |     ic = Iconv.new('GBK//IGNORE', 'UTF-8//IGNORE')
 | 
						
						
						
							|  |  |     input_filename = files_paths
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | 		rename_zipfile = zip_name_refer ||= "archive_#{Time.now.to_i}.zip"
 | 
						
						
						
							|  |  |     zipfile_name = "#{output_path}/#{rename_zipfile}"
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |     Dir.mkdir(File.dirname(zipfile_name)) unless File.exist?(File.dirname(zipfile_name))
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | 		Zip::File.open(zipfile_name, Zip::File::CREATE) do |zipfile|
 | 
						
						
						
							|  |  | 			input_filename.each do |filename|
 | 
						
						
						
							|  |  | 				rename_file = Time.now.to_i.to_s+ ic.iconv( (File.basename(filename)) ).to_s
 | 
						
						
						
							|  |  | 				rename_file = ic.iconv( filename_to_real( File.basename(filename))).to_s if is_attachment
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | 				zipfile.add(rename_file, filename)
 | 
						
						
						
							|  |  | 			end
 | 
						
						
						
							|  |  | 			zipfile.get_output_stream('ReadMe') do |os|
 | 
						
						
						
							|  |  |         os.write 'Homeworks'
 | 
						
						
						
							|  |  |       end
 | 
						
						
						
							|  |  |     end
 | 
						
						
						
							|  |  |     zipfile_name
 | 
						
						
						
							|  |  |   rescue Errno => e
 | 
						
						
						
							|  |  |     logger.error "[zipdown#zipping] ===> #{e}"
 | 
						
						
						
							|  |  |     @error = e
 | 
						
						
						
							|  |  |   end
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |   #def ziping files_path
 | 
						
						
						
							|  |  |   #  ic = Iconv.new('GBK//IGNORE', 'UTF-8//IGNORE')
 | 
						
						
						
							|  |  |   #  folder = SaveFolder
 | 
						
						
						
							|  |  |   #  input_filename = files_path
 | 
						
						
						
							|  |  |   #  zipfile_name = "#{OutputFolder}/archive_#{Time.now.to_i}.zip"
 | 
						
						
						
							|  |  |   #
 | 
						
						
						
							|  |  |   #  Dir.mkdir(File.dirname(zipfile_name)) unless File.exist?(File.dirname(zipfile_name))
 | 
						
						
						
							|  |  |   #  Zip::File.open(zipfile_name, Zip::File::CREATE) do |zipfile|
 | 
						
						
						
							|  |  |   #    input_filename.each do |filename|
 | 
						
						
						
							|  |  |   #      zipfile.add(ic.iconv(filename_to_real(File.basename(filename))), folder + '/' + filename)
 | 
						
						
						
							|  |  |   #    end
 | 
						
						
						
							|  |  |   #    zipfile.get_output_stream("ReadMe") { |os|
 | 
						
						
						
							|  |  |   #      os.write "Homeworks"
 | 
						
						
						
							|  |  |   #    }
 | 
						
						
						
							|  |  |   #  end
 | 
						
						
						
							|  |  |   #  zipfile_name
 | 
						
						
						
							|  |  |   #rescue Errno => e
 | 
						
						
						
							|  |  |   #  logger.error "[zipdown#zipping] ===> #{e}"
 | 
						
						
						
							|  |  |   #  @error = e
 | 
						
						
						
							|  |  |   #end
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |   def detect_content_type(name)
 | 
						
						
						
							|  |  |     content_type = Redmine::MimeType.of(name)
 | 
						
						
						
							|  |  |     content_type.to_s
 | 
						
						
						
							|  |  |   end
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |   def filename_to_real(name)
 | 
						
						
						
							|  |  |     attach = Attachment.find_by_disk_filename(name)
 | 
						
						
						
							|  |  |     attach.filename
 | 
						
						
						
							|  |  |   end
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | end
 |