public function dealInput($buffer)
如果傳輸文件不通過pack
怎么效驗文件是否上傳完成?
1、可以在頭部明文標(biāo)記長度
例如傳輸這樣的數(shù)據(jù) 1024\n$file_binary_data ,其中\(zhòng)n是個分隔符(你也可以用其它字符),用來分隔數(shù)據(jù)長度部分(1024)和文件數(shù)據(jù)部分($file_binary_data)
然后dealInput 判斷數(shù)據(jù)是否收完整就可以這樣
public function dealInput ($buffer)
{
// 第一個元素是長度, 第二個元素是文件數(shù)據(jù)(由于網(wǎng)絡(luò)分包,這部分?jǐn)?shù)據(jù)可能還沒傳遞完整,所以需要判斷)
$buffer_data = explode("\n", $buffer, 2);
$total_len = $buffer_data;
$recv_len = strlen($buffer);
if($total_len <= $recv_len)
{
return 0
}
return $total_len - $recv_len;
}
2、將文件base64編碼(體積估計增大1/3),這樣文件就變成明文,變成明文后就方便多了,可以利用json傳輸更多內(nèi)容,例如文件類型、文件名等,然后在json數(shù)據(jù)末尾加一個標(biāo)記,例如\n,標(biāo)記整個文件數(shù)據(jù)包的結(jié)束。
例如傳輸這樣的數(shù)據(jù) {"file_name":"my_logo.png", "type":"img", "base64_data":"xxxxxx"}."\n"
然后dealInput 判斷數(shù)據(jù)是否收完整就可以這樣
public function dealInput ($buffer)
{
// 判斷最有一個字符是不是\n
if($buffer_data == "\n")
{
// 由于不知道數(shù)據(jù)包整體的長度,所以隨便返回個數(shù)字(短鏈接可以return 任意大于0的數(shù)字;長鏈接應(yīng)該返回1,以避免多讀數(shù)據(jù))
return 65535;
}
return 0;
}
3、當(dāng)然還有其它方法
采用普通方式,直接使用Man\Core\SocketWorker來判斷包,處理包,可以這樣做。如果采用gateway方式斷點續(xù)傳上傳文件的話,請求總是不做處理,正在查看問題