文件上传小雨

0

public function dealInput($buffer)
如果传输文件不通过pack
怎么效验文件是否上传完成?

已邀请:

walkor

赞同来自: smith ev

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、当然还有其它方法

mrfinger

赞同来自:

传输文件不通过pack是什么意思,是通过其他渠道上传的意思吗?
如果通过nginx上传,那应该会有返回,通过返回来确定是否上传完毕

要回复问题请先登录注册