前端用AFNetworking的POST方法做圖片上傳
理論上講线罕,POST是沒有大小限制的欢唾。HTTP協(xié)議規(guī)范也沒有進行大小限制壳澳,起限制作用的是服務(wù)器的處理程序的處理能力。但上傳一個15k左右的圖片是成功的拼缝,而換成100k的直接報500內(nèi)部錯誤娱局。這個是什么原因?qū)е碌哪兀?/h5>
查wiki可知,上傳文件大小相關(guān)的有三個配置
client_body_buffer_size // 配置請求體緩存區(qū)大小, 不配的話咧七,
client_body_temp_path // 設(shè)置臨時文件存放路徑衰齐。只有當上傳的請求體超出緩存區(qū)大小時,才會寫到臨時文件中
client_max_body_size // 設(shè)置上傳文件的最大值
所以查出來继阻,問題出現(xiàn)的原因是
1.文件大小超過了client_body_buffer_size
2.client_body_temp_path的臨時文件路徑居然沒有寫權(quán)限
以上兩個原因?qū)е铝朔祷?00錯誤娇斩。
如果上傳文件大小超過client_max_body_size時,會報413 entity too large的錯誤穴翩。
原因知道了犬第,修正就簡單了。
1.client_body_buffer_size 盡量設(shè)置的大點芒帕,這是基于速度的考慮歉嗓,如果因為設(shè)置的過小,導(dǎo)致上傳的文件老要寫磁盤背蟆,那速度就太慢了鉴分。
2.client_body_temp_path 路徑要有可寫權(quán)限,這個是明顯的錯誤了带膀。改正了就好
3.client_max_body_size 設(shè)置上傳文件的最大值志珍,這個是基于安全的考慮,我們認為正常用戶不會或者基本不會上傳太大的文件垛叨。
可以設(shè)置為client_max_body_size 100m; 或者按照自己的業(yè)務(wù)來設(shè)置這個值伦糯。
client_body_buffer_size
語法:client_body_buffer_size the_size
默認值:8k/16k
使用字段:http, server, location
這個指令可以指定連接請求實體的緩沖區(qū)大小。
如果連接請求超過緩存區(qū)指定的值嗽元,那么這些請求實體的整體或部分將嘗試寫入一個臨時文件敛纲。
默認值為兩個內(nèi)存分頁大小值,根據(jù)平臺的不同剂癌,可能是8k或16k淤翔。
當請求頭中的Content-Length字段小于指定的buffer size,那么Nginx將使用較小的一個佩谷,所以nginx并不總是為每一個請求分配這個buffer size大小的buffer旁壮。