Nginx upload上傳模塊(學(xué)習(xí)筆記十七)

上傳模塊配置樣例:

# 上傳大小限制(包括所有內(nèi)容)

client_max_body_size 100m;


# 上傳path配置

location /upload {

????# 轉(zhuǎn)到后臺(tái)處理URL

????upload_pass?? /uploadHandle;


????# 臨時(shí)保存路徑

????# 可以使用散列

????upload_store /tmp/nginx_upload;


????# 上傳文件的權(quán)限轩端,rw表示讀寫 r只讀

????upload_store_access user:rw;


????# 這里寫入http報(bào)頭,pass到后臺(tái)頁面后能獲取這里set的報(bào)頭字段

????upload_set_form_field "${upload_field_name}_name"?$upload_file_name;

????upload_set_form_field "${upload_field_name}_content_type"?$upload_content_type;

????upload_set_form_field "${upload_field_name}_path"?$upload_tmp_path;


????# Upload模塊自動(dòng)生成的一些信息,如文件大小與文件md5值

????upload_aggregate_form_field "${upload_field_name}_md5"?$upload_file_md5;

????upload_aggregate_form_field "${upload_field_name}_size"?$upload_file_size;


????# 允許的字段,允許全部可以 "^.*$"

????upload_pass_form_field "^submit$|^description$";


????# 每秒字節(jié)速度控制,0表示不受控制己儒,默認(rèn)0

????upload_limit_rate 0;


????# 如果pass頁面是以下狀態(tài)碼,就刪除此次上傳的臨時(shí)文件

????upload_cleanup 400 404 499 500-505;

}


一. nginx upload module原理

官方文檔:http://www.grid.net.ru/nginx/upload.en.html

Nginx upload module通過nginx服務(wù)來接受用戶上傳的文件,自動(dòng)解析請(qǐng)求體中存儲(chǔ)的所有文件上傳到upload_store指定的目錄下豫领。這些文件信息從原始請(qǐng)求體中分離并根據(jù)nginx.conf中的配置重新組裝好上傳參數(shù),交由upload_pass指定的段處理舔琅,從而允許處理任意上傳文件等恐。每個(gè)上傳文件中的file字段值被一系列的upload_set_form_field指令值替換。每個(gè)上傳文件的內(nèi)容可以從$upload_tmp_path變量讀取搏明,或者可以將文件轉(zhuǎn)移到目的目錄下鼠锈。上傳的文件移除可以通過upload_cleanup指令控制。如果請(qǐng)求的方法不是POST星著,模塊將返回405錯(cuò)誤(405 Not Allowed)购笆,該錯(cuò)誤提示可以通過error_page指令處理。

具體的過程如下:

1. 用戶訪問能夠選擇上傳文件的頁面

2. 用戶提交表單

3. 瀏覽器把文件和有關(guān)文件的信息作為請(qǐng)求的一部分發(fā)送給服務(wù)器

4. 服務(wù)器把文件保存到臨時(shí)存儲(chǔ)目錄下upload_store

5. upload_pass指定的處理表單提交的php頁面將文件從upload_store拷貝到持久存儲(chǔ)位置

二.nginx upload module配置參數(shù)

upload_pass 指明后續(xù)處理的php地址虚循。文件中的字段將被分離和取代同欠,包含必要的信息處理上傳文件。

upload_resumable 是否啟動(dòng)可恢復(fù)上傳横缔。

upload_store 指定上傳文件存放地址(目錄)铺遂。目錄可以散列,在這種情況下茎刚,在nginx啟動(dòng)前襟锐,所有的子目錄必須存在。

upload_state_store 指定保存上傳文件可恢復(fù)上傳的文件狀態(tài)信息目錄膛锭。目錄可以散列粮坞,在這種情況下蚊荣,在nginx啟動(dòng)前,所有的子目錄必須存在莫杈。

upload_store_access 上傳文件的訪問權(quán)限互例,user:r是指用戶可讀

upload_pass_form_field 從表單原樣轉(zhuǎn)到后端的參數(shù),可以正則表達(dá)式表示筝闹。:

$upload_field_name — 原始文件中的字段的名稱

upload_pass_form_field “^submit$|^description$”;

意思是把submit媳叨,description這兩個(gè)字段也原樣通過upload_pass傳遞到后端php處理。如果希望把所有的表單字段都傳給后端可以用upload_pass_form_field “^.*$”;

upload_set_form_field 名稱和值都可能包含以下特殊變量:

$upload_field_name 表單的name值

$upload_content_type 上傳文件的類型

$upload_file_name 客戶端上傳的原始文件名稱

$upload_tmp_path 文件上傳后保存在服務(wù)端的位置

upload_aggregate_form_field 可以多使用的幾個(gè)變量,文件接收完畢后生成的并傳遞到后端

$upload_file_md5 文件的MD5校驗(yàn)值

$upload_file_md5_uc 大寫字母表示的MD5校驗(yàn)值

$upload_file_sha1 文件的SHA1校驗(yàn)值

$upload_file_sha1_uc 大寫字母表示的SHA1校驗(yàn)值

$upload_file_crc32 16進(jìn)制表示的文件CRC32值

$upload_file_size 文件大小

$upload_file_number 請(qǐng)求體中的文件序號(hào)

這些字段值是在文件成功上傳后計(jì)算的关顷。

upload_cleanup 如果出現(xiàn)400 404 499 500-505之類的錯(cuò)誤糊秆,則刪除上傳的文件

upload_buffer_size 上傳緩沖區(qū)大小

upload_max_part_header_len 指定頭部分最大長度字節(jié)。

upload_max_file_size 指定上傳文件最大大小解寝,軟限制扩然。client_max_body_size硬限制。

upload_limit_rate 上傳限速聋伦,如果設(shè)置為0則表示不限制夫偶。

upload_max_output_body_len 超過這個(gè)大小,將報(bào)403錯(cuò)(Request entity too large)觉增。

upload_tame_arrays 指定文件字段名的方括號(hào)是否刪除

upload_pass_args 是否轉(zhuǎn)發(fā)參數(shù)兵拢。

三. nginx配置

# wget http://www.nginx.org/download/nginx-1.2.2.tar.gz

# wget http://www.grid.net.ru/nginx/download/nginx_upload_module-2.2.0.tar.gz

# tar zxvf nginx_upload_module-2.2.0.tar.gz -c ../software/

# tar zxvf nginx_upload_module-2.2.0.tar.gz -C ../software/

# ./configure –prefix=/usr/local/nginx –add-module=../nginx_upload_module-2.2.0 –with-http_secure_link_module

# make

# make install

# vi nginx.conf

user www-data;

worker_processes 20;

error_log logs/error.log notice;

working_directory /usr/local/nginx;

events {

worker_connections 1024;

}

http {

include mime.types;

default_type application/octet-stream;

root /www/web/upload;

server {

listen 80;

server_name 192.168.41.129;


error_page 405 =200 @405; //處理405錯(cuò)誤

location / {

index index.html index.htm index.php;

}

location @405

{

root /www/web/upload;

}

location ~ \.php$ {

try_files $uri /404.html;

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

include /etc/nginx/fastcgi_params;

}

client_max_body_size 100m;

# 上傳頁面提交到這個(gè)location

location /upload {

# 文件上傳以后轉(zhuǎn)交給后端的php代碼處理

upload_pass @test;

# 上傳文件的臨時(shí)存儲(chǔ)位置,目錄是散列的逾礁,應(yīng)該存在子目錄0 1 2 3 4 5 6 7 8 9

upload_store /www/web/upload/tmp 1;

upload_store_access user:r;

# 設(shè)置請(qǐng)求體的字段

upload_set_form_field “${upload_field_name}_name” $upload_file_name;

upload_set_form_field “${upload_field_name}_content_type” $upload_content_type;

upload_set_form_field “${upload_field_name}_path” $upload_tmp_path;

# 指示后端關(guān)于上傳文件的md5值和文件大小

upload_aggregate_form_field “${upload_field_name}_md5″ $upload_file_md5;

upload_aggregate_form_field “${upload_field_name}_size” $upload_file_size;

# 指示原樣轉(zhuǎn)到后端的參數(shù)说铃,可以用正則表達(dá)式表示

upload_pass_form_field “^submit$|^description$”;

upload_pass_args on;

}

# 將請(qǐng)求轉(zhuǎn)到后端的地址處理

location @test {

rewrite ^(.*)$ /test.php last;

}

}

}

四. 上傳界面

# cat /www/web/upload/upload.html

Test upload

Select files to upload

五. upload_pass處理內(nèi)容

# cat test.php //這里只是簡單的打印出來,便于先理解上傳原理嘹履。請(qǐng)對(duì)著輸出內(nèi)容理解下nginx upload module配置參數(shù)腻扇。


print_r($_POST);

?>

對(duì)上傳文件的處理請(qǐng)參考:http://cn.php.net/manual/en/features.file-upload.php

六. 測(cè)試

http://192.168.41.129/upload.html

輸出內(nèi)容如下所示:

Array

(

[file1_name] => LearningPerl, Sixth Edition.pdf

[file1_content_type] => application/pdf

[file1_path] => /www/web/upload/tmp/4/0000000014

[file1_md5] => 87032cc58109f5c6bb866d2684f9b48c

[file1_size] => 8927511

[file2_name] => Programming Perl, 4th Edition.pdf

[file2_content_type] => application/pdf

[file2_path] => /www/web/upload/tmp/5/0000000015

[file2_md5] => 82a52df177a8912c06af276581cfd5e4

[file2_size] => 21146356

[submit] => Upload

)

注意:需要修改php.ini以下參數(shù)

file_uploads on 是否允許通過http上傳

upload_max_filesize 8m 允許上傳文件的最大大小

post_max_size 8m 通過表單POST給php所能接收的最大值

另外nginx.conf中設(shè)置上傳文件大小

upload_max_file_size 軟限制

client_max_body_size 硬限制




一.?nginx?upload?module原理

官方文檔:http://www.grid.net.ru/nginx/upload.en.html

Nginx?upload?module通過nginx服務(wù)來接受用戶上傳的文件,自動(dòng)解析請(qǐng)求體中存儲(chǔ)的所有文件上傳到upload_store指定的目錄下砾嫉。這些文件信息從原始請(qǐng)求體中分離并根據(jù)nginx.conf中的配置重新組裝好上傳參數(shù)幼苛,交由upload_pass指定的段處理,從而允許處理任意上傳文件焕刮。每個(gè)上傳文件中的file字段值被一系列的upload_set_form_field指令值替換舶沿。每個(gè)上傳文件的內(nèi)容可以從$upload_tmp_path變量讀取,或者可以將文件轉(zhuǎn)移到目的目錄下配并。上傳的文件移除可以通過upload_cleanup指令控制括荡。如果請(qǐng)求的方法不是POST,模塊將返回405錯(cuò)誤(405?Not?Allowed)溉旋,該錯(cuò)誤提示可以通過error_page指令處理畸冲。

具體的過程如下:

1.?用戶訪問能夠選擇上傳文件的頁面

2.?用戶提交表單

3.?瀏覽器把文件和有關(guān)文件的信息作為請(qǐng)求的一部分發(fā)送給服務(wù)器

4.?服務(wù)器把文件保存到臨時(shí)存儲(chǔ)目錄下upload_store

5.?upload_pass指定的處理表單提交的php頁面將文件從upload_store拷貝到持久存儲(chǔ)位置


P.S.

安裝編譯方法

1.下載

1wget http://www.grid.net.ru/nginx/download/nginx_upload_module-2.2.0.tar.gz


2.編譯(在NGINX編譯目錄執(zhí)行以下命令,?其中?--add-module=你下載解壓的上傳插件目錄)


./configure--user=www --group=www --prefix=/usr/local/nginx--with-http_stub_status_module --with-http_s

sl_module --with-http_gzip_static_module --add-module=/data/downfile/nginx_upload_module-2.2.0


二.nginx?upload?module配置參數(shù)

upload_pass?指明后續(xù)處理的php地址。文件中的字段將被分離和取代,包含必要的信息處理上傳文件召夹。

upload_resumable?是否啟動(dòng)可恢復(fù)上傳岩喷。

upload_store?指定上傳文件存放地址(目錄)。目錄可以散列监憎,在這種情況下,在nginx啟動(dòng)前婶溯,所有的子目錄必須存在鲸阔。

upload_state_store?指定保存上傳文件可恢復(fù)上傳的文件狀態(tài)信息目錄。目錄可以散列迄委,在這種情況下褐筛,在nginx啟動(dòng)前,所有的子目錄必須存在叙身。

upload_store_access?上傳文件的訪問權(quán)限渔扎,user:r是指用戶可讀

upload_pass_form_field?從表單原樣轉(zhuǎn)到后端的參數(shù),可以正則表達(dá)式表示信轿。:

$upload_field_name?—?原始文件中的字段的名稱

upload_pass_form_field?“^submit$|^description$”;

意思是把submit晃痴,description這兩個(gè)字段也原樣通過upload_pass傳遞到后端php處理。如果希望把所有的表單字段都傳給后端可以用upload_pass_form_field?“^.*$”;

upload_set_form_field?名稱和值都可能包含以下特殊變量:

$upload_field_name?表單的name值

$upload_content_type?上傳文件的類型

$upload_file_name?客戶端上傳的原始文件名稱

$upload_tmp_path?文件上傳后保存在服務(wù)端的位置

upload_aggregate_form_field?可以多使用的幾個(gè)變量,文件接收完畢后生成的并傳遞到后端

$upload_file_md5?文件的MD5校驗(yàn)值

$upload_file_md5_uc?大寫字母表示的MD5校驗(yàn)值

$upload_file_sha1?文件的SHA1校驗(yàn)值

$upload_file_sha1_uc?大寫字母表示的SHA1校驗(yàn)值

$upload_file_crc32?16進(jìn)制表示的文件CRC32值

$upload_file_size?文件大小

$upload_file_number?請(qǐng)求體中的文件序號(hào)

這些字段值是在文件成功上傳后計(jì)算的财忽。

upload_cleanup?如果出現(xiàn)400?404?499?500-505之類的錯(cuò)誤倘核,則刪除上傳的文件

upload_buffer_size?上傳緩沖區(qū)大小

upload_max_part_header_len?指定頭部分最大長度字節(jié)。

upload_max_file_size?指定上傳文件最大大小即彪,軟限制紧唱。client_max_body_size硬限制。

upload_limit_rate?上傳限速隶校,如果設(shè)置為0則表示不限制漏益。

upload_max_output_body_len?超過這個(gè)大小,將報(bào)403錯(cuò)(Request?entity?too?large)深胳。

upload_tame_arrays?指定文件字段名的方括號(hào)是否刪除

upload_pass_args?是否轉(zhuǎn)發(fā)參數(shù)绰疤。


三.?nginx配置

#wget http: //www.nginx.org/download/nginx-1.2.2.tar.gz

#wget http: //www.grid.net.ru/nginx/download/nginx_upload_module-2.2.0.tar.gz

#tar zxvf nginx_upload_module - 2.2.0.tar.gz - c.. / software /

#tar zxvf nginx_upload_module - 2.2.0.tar.gz - C.. / software /

#. / configure–prefix = /usr/local / nginx–add - module = .. / nginx_upload_module - 2.2.0–with - http_secure_link_module

#make

#make install? #vi nginx.conf

user www - data;

worker_processes 20;

error_log logs / error.log notice;

working_directory / usr /?local/ nginx;? events {

worker_connections 1024;

}? http {

include mime.types;

default_type application / octet - stream;

root / www / web / upload;

server {

listen 80;

server_name 192.168.41.129;

error_page 405 = 200@405;?//處理405錯(cuò)誤

?location / {

index index.html index.htm index.php;

}

location@405 {

root / www / web / upload;

}? location~\.php$ {

try_files $uri / 404.html;

fastcgi_pass 127.0.0.1 : 9000;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

include?/etc/nginx/fastcgi_params;

}? client_max_body_size 100m;?#上傳頁面提交到這個(gè)location? location / upload {

#文件上傳以后轉(zhuǎn)交給后端的php代碼處理

upload_pass@test;

#上傳文件的臨時(shí)存儲(chǔ)位置,目錄是散列的稠屠,應(yīng)該存在子目錄0 1 2 3 4 5 6 7 8 9

upload_store?/www/web/upload/tmp1;

upload_store_access user: r;

#設(shè)置請(qǐng)求體的字段? upload_set_form_field "${upload_field_name}_name" $upload_file_name;

upload_set_form_field?"${upload_field_name}_content_type"$upload_content_type;

upload_set_form_field?"${upload_field_name}_path"$upload_tmp_path;

# 指示后端關(guān)于上傳文件的md5值和文件大小

upload_aggregate_form_field?"${upload_field_name}_md5"$upload_file_md5;

upload_aggregate_form_field?"${upload_field_name}_size"$upload_file_size;

# 指示原樣轉(zhuǎn)到后端的參數(shù)峦睡,可以用正則表達(dá)式表示

upload_pass_form_field?"^submit$|^description$";

upload_pass_args on;

}?#將請(qǐng)求轉(zhuǎn)到后端的地址處理

location@test{

rewrite ^ (. * ) $ /?test.php last;

}

}

}



四.?上傳界面

#?cat?/www/web/upload/upload.html

五.?upload_pass處理內(nèi)容

#?cat?test.php?//這里只是簡單的打印出來,便于先理解上傳原理权埠。請(qǐng)對(duì)著輸出內(nèi)容理解下nginx?upload?module配置參數(shù)榨了。


print_r($_POST);

?>

對(duì)上傳文件的處理請(qǐng)參考:http://cn.php.net/manual/en/features.file-upload.php

六.?測(cè)試

http://192.168.41.129/upload.html

輸出內(nèi)容如下所示:

Array

(

[file1_name]?=>?Learning?Perl,?Sixth?Edition.pdf

[file1_content_type]?=>?application/pdf

[file1_path]?=>?/www/web/upload/tmp/4/0000000014

[file1_md5]?=>?87032cc58109f5c6bb866d2684f9b48c

[file1_size]?=>?8927511

[file2_name]?=>?Programming?Perl,?4th?Edition.pdf

[file2_content_type]?=>?application/pdf

[file2_path]?=>?/www/web/upload/tmp/5/0000000015

[file2_md5]?=>?82a52df177a8912c06af276581cfd5e4

[file2_size]?=>?21146356

[submit]?=>?Upload

)

注意:需要修改php.ini以下參數(shù)

file_uploads?on?是否允許通過http上傳

upload_max_filesize?8m?允許上傳文件的最大大小

post_max_size?8m?通過表單POST給php所能接收的最大值

另外nginx.conf中設(shè)置上傳文件大小

upload_max_file_size?軟限制

client_max_body_size?硬限制

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市攘蔽,隨后出現(xiàn)的幾起案子龙屉,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件转捕,死亡現(xiàn)場(chǎng)離奇詭異作岖,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)五芝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門痘儡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人枢步,你說我怎么就攤上這事沉删。” “怎么了醉途?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵矾瑰,是天一觀的道長。 經(jīng)常有香客問我隘擎,道長殴穴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任货葬,我火速辦了婚禮采幌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘宝惰。我一直安慰自己植榕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布尼夺。 她就那樣靜靜地躺著尊残,像睡著了一般。 火紅的嫁衣襯著肌膚如雪淤堵。 梳的紋絲不亂的頭發(fā)上寝衫,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音拐邪,去河邊找鬼慰毅。 笑死,一個(gè)胖子當(dāng)著我的面吹牛扎阶,可吹牛的內(nèi)容都是我干的汹胃。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼东臀,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼着饥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起惰赋,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤宰掉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體轨奄,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡孟害,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了挪拟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挨务。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖舞丛,靈堂內(nèi)的尸體忽然破棺而出耘子,到底是詐尸還是另有隱情,我是刑警寧澤球切,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站绒障,受9級(jí)特大地震影響吨凑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜户辱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一鸵钝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧庐镐,春花似錦恩商、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至名眉,卻和暖如春粟矿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背损拢。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國打工陌粹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人福压。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓掏秩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親荆姆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蒙幻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 用ruby on rails開發(fā)的web杆煞,用了carrierwave和dropzone實(shí)現(xiàn)了上傳文件。但后來發(fā)現(xiàn),...
    limx閱讀 761評(píng)論 0 0
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理决乎,服務(wù)發(fā)現(xiàn)队询,斷路器,智...
    卡卡羅2017閱讀 134,651評(píng)論 18 139
  • 1. Nginx的模塊與工作原理 Nginx由內(nèi)核和模塊組成构诚,其中蚌斩,內(nèi)核的設(shè)計(jì)非常微小和簡潔,完成的工作也非常簡單...
    rosekissyou閱讀 10,209評(píng)論 5 124
  • 培訓(xùn)的一二三四五六技巧 一 以學(xué)員為中心 二 雙向互動(dòng) 三部曲 *內(nèi)容提要(概述所講內(nèi)容主要要點(diǎn)) *內(nèi)容展開(詳...
    雯雯zi閱讀 914評(píng)論 0 4
  • 在我的記憶里范嘱,老家就是山腳下一個(gè)小山村送膳。說是山村,靠著的卻是別人的山丑蛤,與我們毫無關(guān)系叠聋,但是每年春天杏花開的...
    昨夜星雨閱讀 1,219評(píng)論 2 14