class AvatarController < ApplicationController #before_filter :set_cache_buster include AvatarHelper def upload # Make sure that API users get used to set this content type # as it won't trigger Rails' automatic parsing of the request body for parameters unless request.content_type == 'application/octet-stream' render :nothing => true, :status => 406 return end unless request.raw_post.nil? @source_type = params[:source_type] @source_id = params[:source_id] @temp_file = request.raw_post if @temp_file.size > 0 if @temp_file.respond_to?(:original_filename) @image_file = @temp_file.original_filename #image_file.force_encoding("UTF-8") if filename.respond_to?(:force_encoding) else @image_file=params[:filename] end end end if @temp_file && (@temp_file.size > 0) diskfile=disk_filename(@source_type,@source_id) @urlfile='/' << File.join("images","avatars",avatar_directory(@source_type),avatar_filename(@source_id,@image_file)) # 用户头像上传时进行特别处理 if @source_type == 'User' diskfile += "temp" @urlfile += "temp" end logger.info("Saving avatar '#{diskfile}' (#{@temp_file.size} bytes)") path = File.dirname(diskfile) unless File.directory?(path) FileUtils.mkdir_p(path) end md5 = Digest::MD5.new File.open(diskfile, "wb") do |f| if @temp_file.respond_to?(:read) buffer = "" while (buffer = @temp_file.read(8192)) f.write(buffer) md5.update(buffer) end else f.write(@temp_file) md5.update(@temp_file) end end # self.digest = md5.hexdigest end @temp_file = nil # @avatar = Avatar.new(:receive_file => request.raw_post) # @avatar.source_id = User.current.id # @avatar.image_file = params[:filename].presence || Redmine::Utils.random_hex(16) # saved = @avatar.save begin f = Magick::ImageList.new(diskfile) # gif格式不再做大小处理 if f.format != 'GIF' width = 300.0 proportion = (width/f[0].columns) height = (f[0].rows*proportion) f.resize_to_fill!(width,height) f.write(diskfile) end rescue Exception => e logger.error "[Error] avatar : avatar_controller#upload ===> #{e}" end respond_to do |format| format.js format.api { if saved render :action => 'upload', :status => :created else render_validation_errors(@avatar) end } end end #add by zjc #删除图片 def delete_image @source_type = params[:source_type] @source_id = params[:source_id] @source = nil #eval(@source_type).find(@source_id) c = Object.const_get(@source_type) if c.respond_to?(:find) @source = c.find(@source_id) end diskfile=disk_filename(@source_type,@source_id) unless diskfile.nil? || diskfile == "" path = File.dirname(diskfile) if File.directory?(path) && File.exist?(diskfile) # 用户头像进行特别处理 if @source_type == 'User' diskfile1 = diskfile + 'temp' File.open(diskfile1, "wb") do |f| buffer = "DELETE" f.write(buffer) end else File.delete(diskfile) end end end rescue e do logger.info e.message end respond_to do |format| format.js format.api { if saved render :action => 'upload', :status => :created else render_validation_errors(@avatar) end } end end private def set_cache_buster response.headers["Cache-Control"] = "no-cache, no-store, max-age=0, must-revalidate" response.headers["Pragma"] = "no-cache" response.headers["Expires"] = "Fri, 01 Jan 1990 00:00:00 GMT" end end