文件上传小雨

smith

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

4707 2 0
2个回答

mrfinger

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

  • 暂无评论
walkor

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

  • ev 2014-09-05

    采用普通方式,直接使用Man\Core\SocketWorker来判断包,处理包,可以这样做。如果采用gateway方式断点续传上传文件的话,请求总是不做处理,正在查看问题

年代过于久远,无法发表回答
🔝