memcached_alan^2
yutao 10 years ago
commit 53503bffe4

@ -1,9 +1,9 @@
class AvatarController < ApplicationController
include ActionView::Helpers::NumberHelper
#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
@ -29,43 +29,51 @@ class AvatarController < ApplicationController
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 @temp_file.size > Setting.upload_avatar_max_size.to_i
@status = 1
@msg = l(:error_upload_avatar_to_large, :max_size => number_to_human_size(Setting.upload_avatar_max_size.to_i))
elsif Trustie::Utils::Image.new(@temp_file.tempfile.path).image?
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'
# 用户头像上传时进行特别处理
if @source_type == 'User'
diskfile += "temp"
@urlfile += "temp"
end
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)
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
else
f.write(@temp_file)
md5.update(@temp_file)
end
Trustie::Utils::Image.new(diskfile,true).compress(300)
@status = 0
@msg = ''
else
@status = 2
@msg = l(:not_valid_image_file)
end
# self.digest = md5.hexdigest
end
@temp_file = nil
image = Trustie::Utils::Image.new(diskfile,true)
image.compress(300)
respond_to do |format|
format.json{
render :inline => "#{@urlfile.to_s}?#{Time.now.to_i}",:content_type => 'text/html'
render :inline => {status: @status, message:@msg, url:"#{@urlfile.to_s}?#{Time.now.to_i}"}.to_json,:content_type => 'text/html'
return
}
format.js

@ -65,6 +65,16 @@ module ProjectsHelper
content_tag('div', content, :class => "tabs")
end
# 判断我的项目中是否有重名项目
def judge_same_projectname(user, project_name)
result = false
my_projects = user.projects
my_projects.each do |mp|
result = true if mp.name == project_name
end
return result
end
# Added by young
def course_settings_tabs
tabs = [{:name => 'info', :action => :edit_project, :partial => 'projects/edit', :label => :label_information_plural, :course=>'1'},

@ -199,7 +199,7 @@
</td>
<% end %>
</tr>
<% elsif @user.user_extensions.identity == 3 && @user.user_extensions.occupation.empty? %>
<% elsif @user.user_extensions.identity == 3 && @user.user_extensions.occupation %>
<tr>
<td style=" float: right" width="70px">
<span style="float: right"> <%= l(:field_occupation) %></span>

@ -36,9 +36,9 @@
<%= link_to h(news.title), news_path(news),:class => 'problem_tit fl fb c_dblue' %>
<br />
<div class="cl mb5"></div>
<p id="news_description_<%= news.id %>" class="news_description mt5">
<div id="news_description_<%= news.id %>" class="news_description mt5">
<%= news.description.html_safe %>
</p>
</div>
<div class="news_foot c_red" style="cursor:pointer;display: none;" onclick="news_show_more_des(<%= news.id %>);" id="news_foot_<%= news.id %>">
<%= l(:button_more)%>...
<span class="g-arr-down"></span>

@ -113,6 +113,7 @@ en:
one: "1 error prohibited this %{model} from being saved"
other: "%{count} errors prohibited this %{model} from being saved"
messages:
record_invalid: "validate error: %{errors}"
inclusion: "is not included in the list"
exclusion: "is reserved"
invalid: "is invalid"
@ -428,4 +429,4 @@ en:
previous: "&laquo; Previous"
next: "Next &raquo;"
truncate: "..."

@ -121,6 +121,7 @@ zh:
one: "由于发生了一个错误 %{model} 无法保存"
other: "%{count} 个错误使得 %{model} 无法保存"
messages:
record_invalid: "校验失败: %{errors}"
inclusion: "不包含于列表中"
exclusion: "是保留关键字"
invalid: "是无效的"
@ -435,4 +436,4 @@ zh:
last: "末页 &raquo;"
previous: "&laquo; 上一页"
next: "下一页 &raquo;"
truncate: "..."
truncate: "..."

@ -1521,4 +1521,5 @@ en:
label_commit_failed: commit failed
#api end
error_upload_avatar_to_large: "too big (%{max_size})"
not_valid_image_file: not a valid image file

@ -1985,3 +1985,4 @@ zh:
label_code: 代码
error_upload_avatar_to_large: "超过大小限制 (%{max_size})"
not_valid_image_file: 不是有效的图片文件

@ -4,6 +4,7 @@ module RailsKindeditor
def kindeditor_tag(name, content = nil, options = {})
id = sanitize_to_id(name)
input_html = { :id => id }.merge(options.delete(:input_html) || {})
input_html = input_html.merge(style: 'display:none')
output = ActiveSupport::SafeBuffer.new
output << text_area_tag(name, content, input_html)
output << javascript_tag(js_replace(id, options.merge(window_onload: 'true')))
@ -12,6 +13,7 @@ module RailsKindeditor
def kindeditor(name, method, options = {})
# TODO: Refactory options: 1. kindeditor_option 2. html_option
input_html = (options.delete(:input_html) || {}).stringify_keys
input_html = input_html.merge(style: 'display:none')
output_buffer = ActiveSupport::SafeBuffer.new
output_buffer << build_text_area_tag(name, method, self, options, input_html)
output_buffer << javascript_tag(js_replace(input_html['id'],options.merge(window_onload: 'true')))

@ -3,11 +3,37 @@
module Trustie
module Utils
class Image
def initialize(file, bak)
def initialize(file, bak=false)
@file = file
@bak = bak
end
def bitmap?(data)
data[0,2]==77.chr + 66.chr
end
def gif?(data)
data[0,4]==71.chr + 73.chr + 70.chr + 56.chr
end
def jpeg?(data)
data[0,4]== 0xff.chr + 0xd8.chr + 0xff.chr + 0xe0.chr
end
def png?(data)
data[0,2]==0x89.chr + 80.chr
end
def image?
begin
f = File.open(@file,'rb') # rb means to read using binary
return false if f.size < 9
data = f.read(9) # magic numbers are up to 9 bytes
return bitmap?(data) || gif?(data) || jpeg?(data) || png?(data)
ensure
f.close
end
end
def compress(size=300)
backup if @bak
begin

File diff suppressed because it is too large Load Diff

@ -44,9 +44,18 @@ $(function() {
},
done: function(e, data) {
var imgSpan = jQuery('#avatar_image');
imgSpan.attr({
"src": data.result.text ? data.result.text() : data.result
});
var result = data.result.text ? data.result.text() : data.result;
if(result){
var o = JSON.parse(result);
if(o.status == 0){
imgSpan.attr({
"src": o.url
});
} else {
alert(o.message);
}
}
}
});
});

@ -425,4 +425,35 @@ $(function(){
personalized_init();
});
//cookie记忆html区块 显示/隐藏 的代码 end
//cookie记忆html区块 显示/隐藏 的代码 end
// 新建项目的时候判断是否与我已有的项目重复
function judgeprojectname(){
$('#new_project').validate({
errorPlacement: function(error, element){
alert('error')
},
success: function(label){
alert('ok')
},
onkeyup: false,
rules : {
name:{required : true,
remote : {
url : 'projects/judge_same_projectname',
type:'get',
dataType:'text',
data:{
name : function(){ return $.trim( $("#name").val() ); }
},
dataFilter:function( data ){
if( data=='true')return false; else return true;
}
}
}
},
messages : {
name:{required : "请填写项目名称!",remote:'您已新建过同名项目,请修改项目名称!'}
}
});
}

@ -2794,3 +2794,4 @@ div.repos_explain{
padding-bottom: 20px;
}
.upload_img img{max-width: 100%;}
#activity .upload_img img{width: 580px;}

@ -0,0 +1,10 @@
#coding=utf-8
#
FactoryGirl.define do
factory :attachment do
filename "11.gif"
filesize 296833
digest "8a74e086d7716f89bc4fbac0606589c7"
disk_directory "2015/05"
end
end

@ -0,0 +1,17 @@
#coding=utf-8
#
#:author_id, :budget, :deadline, :name, :description, :homework_type, :password
FactoryGirl.define do
factory :homework, class: Bid do
name "test homework"
budget 0
deadline {(Time.now+1.days).strftime('%Y-%m-%d')}
description "description"
homework_type 3
reward_type 3
end
factory :homework_attach, class: HomeworkAttach do
end
end

@ -6,4 +6,12 @@ FactoryGirl.define do
password "foobar111"
password_confirmation "foobar111"
end
factory :student, class: User do
login "student"
mail "student@example.com"
password "foobar111"
password_confirmation "foobar111"
end
end

@ -1,5 +0,0 @@
require 'spec_helper'
describe ForumObserver do
pending "add some examples to (or delete) #{__FILE__}"
end

@ -1,5 +0,0 @@
require 'spec_helper'
describe MemoObserver do
pending "add some examples to (or delete) #{__FILE__}"
end

@ -35,13 +35,53 @@ RSpec.describe "课程", :type => :request do
context "修改课程图片" do
include Rack::Test::Methods
let(:avatar) {Rack::Test::UploadedFile.new("#{Rails.root}/spec/fixtures/test.jpg",'image/jpg')}
context "正常图片上传成功" do
subject(:resp) {post upload_avatar_path(source_type: 'Course', source_id: course.id, format: :json),"avatar"=>{image: avatar}}
it{ expect(subject).to be_ok }
it{ expect(subject.body).not_to be_empty }
it "状态要为0" do
o = ActiveSupport::JSON.decode(subject.body)
expect(o["status"]).to eq(0)
end
it "要回传图片地址" do
o = ActiveSupport::JSON.decode(subject.body)
expect(o["url"]).not_to be_empty
end
end
context "不是图片,上传失败" do
let(:invalid_avatar) {Rack::Test::UploadedFile.new("#{Rails.root}/spec/fixtures/hah.txt",'text/plain')}
before do
resp = post upload_avatar_path(source_type: 'Course', source_id: course.id, format: :json),"avatar"=>{image: invalid_avatar}
@o = ActiveSupport::JSON.decode(resp.body)
end
it "状态不为0" do
expect(@o["status"]).not_to eq(0)
end
it "要回传错误信息" do
expect(@o["message"]).to be_include("图片")
end
end
context "文件过大,上传失败" do
before do
big_file = Rack::Test::UploadedFile.new("#{Rails.root}/spec/fixtures/test.jpg",'image/jpg')
allow(ActionDispatch::Http::UploadedFile).to receive(:new).and_return(double('BigFile',size: 10*1024*1024, original_filename: 'rais.jpg', tempfile: nil))
# trace = TracePoint.new(:call) do |tp|
# p [tp.lineno, tp.defined_class, tp.method_id, tp.event] if tp.method_id == :post
# end
resp = post upload_avatar_path(source_type: 'Course', source_id: course.id, format: :json),'avatar[image]'=> big_file
@o = ActiveSupport::JSON.decode(resp.body)
end
it "状态不为0" do
expect(@o["status"]).not_to eq(0)
end
it "要回传错误信息" do
expect(@o["message"]).to be_include("")
end
end
it "不是图片,上传失败"
end
end

@ -1,6 +1,40 @@
require 'rails_helper'
require 'shared_account_spec'
# "attachments"=>{"1"=>{"filename"=>"11.gif", "description"=>"", "is_public_checkbox"=>"1", "token"=>"33731.8a74e086d7716f89bc4fbac0606589c7"}}
RSpec.describe "作业打包下载", :type => :request do
let(:student){FactoryGirl.create(:student)}
describe "单独下载某学生作业" do
include_context "create user"
before {
FactoryGirl.create(:user)
shared_login
@homework = FactoryGirl.create(:homework, author_id: current_user.id)
@attch = HomeworkAttach.new
@attch.bid_id = @homework.id
@attch.user_id = student.id
@attachment = Attachment.new(:file => File.open(File.join(Rails.root, "spec/fixtures/test.jpg")))
@attachment.author = User.current
@attachment.container_type = 'HomeworkAttach'
@attachment.container_id = @attch.id
@attachment.filename = "test.jpg"
@attachment.save
params = {"1"=>{"filename" => "test.jpg", "description" =>"",
"is_public_checkbox"=>"1",
"token" => "#{@attachment.id}.#{@attachment.digest}" }
}
@attch.save_attachments(params)
@attch.name = "test.jpg"
@attch.save!
}
it "正常下载" do
uu = current_user
allow(uu).to receive(:admin?).and_return(true)
allow(User).to receive(:current).and_return(uu)
get zipdown_download_user_homework_path, {homework:@attch.id}
expect(response).to have_http_status(:success)
expect(response.content_type).to eq(Mime::Type.new("applcation/zip",:zip))
end
end
end

Loading…
Cancel
Save