diff --git a/Gemfile b/Gemfile index 29b2716a9..362be8642 100644 --- a/Gemfile +++ b/Gemfile @@ -58,8 +58,6 @@ group :test do #end end - # gem 'rspec-rails' , '2.13.1' - # gem 'guard-rspec','2.5.0' # Gems used only for assets and not required # in production environments by default. group :assets do diff --git a/app/controllers/attachments_controller.rb b/app/controllers/attachments_controller.rb index 23b080d94..23d4c3a16 100644 --- a/app/controllers/attachments_controller.rb +++ b/app/controllers/attachments_controller.rb @@ -108,7 +108,7 @@ class AttachmentsController < ApplicationController end rescue => e - redirect_to "http://" + (Setting.host_name.to_s) +"/file_not_found.html" + redirect_to "http: //" + (Setting.host_name.to_s) +"/file_not_found.html" end #更新资源文件类型 @@ -182,6 +182,8 @@ class AttachmentsController < ApplicationController return end + + logger.debug "upload ..... " @attachment = Attachment.new(:file => request.raw_post) @attachment.author = User.current if !params[:project].nil? @@ -190,6 +192,8 @@ class AttachmentsController < ApplicationController end @attachment.filename = params[:filename].presence || Redmine::Utils.random_hex(16) saved = @attachment.save + logger.debug "upload save ..... " + logger.debug @attchement respond_to do |format| format.js diff --git a/app/controllers/zipdown_controller.rb b/app/controllers/zipdown_controller.rb index 6c5385115..75ffe75bd 100644 --- a/app/controllers/zipdown_controller.rb +++ b/app/controllers/zipdown_controller.rb @@ -7,6 +7,14 @@ class ZipdownController < ApplicationController SAVE_FOLDER = "#{Rails.root}/files" OUTPUT_FOLDER = "#{Rails.root}/tmp/archiveZip" + #统一下载功能 + def download + begin + send_file "#{OUTPUT_FOLDER}/#{params[:file]}", :filename => params[:filename], :type => detect_content_type(params[:file]) + rescue => e + render file: 'public/no_file_found.html' + end + end def assort if params[:obj_class] == "Bid" @@ -21,8 +29,14 @@ class ZipdownController < ApplicationController else logger.error "[ZipDown#assort] ===> #{params[:obj_class]} unKown !!" end - send_file zipfile, :filename => bid.name + ".zip", :type => detect_content_type(zipfile) if zipfile + if zipfile + if zipfile.length > 1 + @mut_down_files = zipfile.map{|x| File.basename(x)} + else + send_file zipfile, :filename => bid.name + ".zip", :type => detect_content_type(zipfile) + end + end #rescue Exception => e # render file: 'public/no_file_found.html' end @@ -71,7 +85,14 @@ class ZipdownController < ApplicationController bid_homework_path << zip_homework_by_user(homeattach) end end - zipping "#{Time.now.to_i}_#{bid.name}.zip", bid_homework_path, OUTPUT_FOLDER + + zips = split_pack_files(bid_homework_path, Setting.pack_attachment_max_size.to_i) + x = 0 + + zips.map { |o| + x += 1 + zipping "#{Time.now.to_i}_#{bid.name}_#{x}.zip", o, OUTPUT_FOLDER + } end def zip_homework_by_user(homeattach) @@ -93,15 +114,21 @@ class ZipdownController < ApplicationController def zipping(zip_name_refer, files_paths, output_path, is_attachment=false, not_exist_file=[]) # 输入待打包的文件列表,已经打包文件定位到ouput_path ic = Iconv.new('GBK//IGNORE', 'UTF-8//IGNORE') - input_filename = files_paths rename_zipfile = zip_name_refer ||= "#{Time.now.to_i.to_s}.zip" zipfile_name = "#{output_path}/#{rename_zipfile}" Dir.mkdir(File.dirname(zipfile_name)) unless File.exist?(File.dirname(zipfile_name)) + unless is_attachment + #都是zip合并,没必要再费力压缩了 + Zip.default_compression = Zlib::NO_COMPRESSION + else + Zip.default_compression = Zlib::DEFAULT_COMPRESSION + end + Zip::File.open(zipfile_name, Zip::File::CREATE) do |zipfile| - input_filename.each do |filename| + files_paths.each do |filename| flag = true index = 1 rename_file = ic.iconv( (File.basename(filename)) ).to_s @@ -128,6 +155,34 @@ class ZipdownController < ApplicationController # logger.error "[zipdown#zipping] ===> #{e}" # @error = e end + + # 合理分配文件打包 + # 如果小于 pack_attachment_max_size, 则返回单个文件 + # 反之则切分为多个文件组返回 + def split_pack_files(files, pack_attachment_max_size) + max_size = 0 + last_files = [] + ret_files = [] + files.each do |f| + if (max_size += File.size(f)) > pack_attachment_max_size + max_size = 0 + if last_files.empty? #如果单个文件超过大小,也将此文件作为一组 + ret_files << [f] + last_files.clear + else + ret_files << last_files + last_files.clear + redo + end + else + last_files << f + end + end + + ret_files << last_files unless last_files.empty? + ret_files + end + def detect_content_type(name) content_type = Redmine::MimeType.of(name) content_type.to_s diff --git a/app/views/settings/_general.html.erb b/app/views/settings/_general.html.erb index ebb3904da..763b65515 100644 --- a/app/views/settings/_general.html.erb +++ b/app/views/settings/_general.html.erb @@ -7,6 +7,7 @@ <%= wikitoolbar_for 'settings_welcome_text' %>
<%= setting_text_field :attachment_max_size, :size => 6 %> <%= l(:"number.human.storage_units.units.kb") %>
+<%= setting_text_field :pack_attachment_max_size, :size => 6 %> <%= l(:"number.human.storage_units.units.kb") %>
<%= setting_text_field :per_page_options, :size => 20 %> <%= l(:text_comma_separated) %>
diff --git a/app/views/zipdown/assort.html.erb b/app/views/zipdown/assort.html.erb index c9056b4fa..3cf873226 100644 --- a/app/views/zipdown/assort.html.erb +++ b/app/views/zipdown/assort.html.erb @@ -1,2 +1,11 @@ -