public function dealInput($buffer) 如果传输文件不通过pack 怎么效验文件是否上传完成?
传输文件不通过pack是什么意思,是通过其他渠道上传的意思吗? 如果通过nginx上传,那应该会有返回,通过返回来确定是否上传完毕
1、可以在头部明文标记长度 例如传输这样的数据 1024\n$file_binary_data ,其中\n是个分隔符(你也可以用其它字符),用来分隔数据长度部分(1024)和文件数据部分($file_binary_data)
然后dealInput 判断数据是否收完整就可以这样
public function dealInput ($buffer) { // 第一个元素是长度, 第二个元素是文件数据(由于网络分包,这部分数据可能还没传递完整,所以需要判断) $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传输更多内容,例如文件类型、文件名等,然后在json数据末尾加一个标记,例如\n,标记整个文件数据包的结束。 例如传输这样的数据 {"file_name":"my_logo.png", "type":"img", "base64_data":"xxxxxx"}."\n" 然后dealInput 判断数据是否收完整就可以这样
public function dealInput ($buffer) { // 判断最有一个字符是不是\n if($buffer_data == "\n") { // 由于不知道数据包整体的长度,所以随便返回个数字(短链接可以return 任意大于0的数字;长链接应该返回1,以避免多读数据) return 65535; } return 0; }
3、当然还有其它方法
采用普通方式,直接使用Man\Core\SocketWorker来判断包,处理包,可以这样做。如果采用gateway方式断点续传上传文件的话,请求总是不做处理,正在查看问题
传输文件不通过pack是什么意思,是通过其他渠道上传的意思吗?
如果通过nginx上传,那应该会有返回,通过返回来确定是否上传完毕
1、可以在头部明文标记长度
例如传输这样的数据 1024\n$file_binary_data ,其中\n是个分隔符(你也可以用其它字符),用来分隔数据长度部分(1024)和文件数据部分($file_binary_data)
然后dealInput 判断数据是否收完整就可以这样
2、将文件base64编码(体积估计增大1/3),这样文件就变成明文,变成明文后就方便多了,可以利用json传输更多内容,例如文件类型、文件名等,然后在json数据末尾加一个标记,例如\n,标记整个文件数据包的结束。
例如传输这样的数据 {"file_name":"my_logo.png", "type":"img", "base64_data":"xxxxxx"}."\n"
然后dealInput 判断数据是否收完整就可以这样
3、当然还有其它方法
采用普通方式,直接使用Man\Core\SocketWorker来判断包,处理包,可以这样做。如果采用gateway方式断点续传上传文件的话,请求总是不做处理,正在查看问题