如何在服务器端拆分JSON,然后在客户端加入并流式传输

时间:2016-06-21 08:58:02

标签: php android mysql json gson

目前我有一个大小为1GB的大型JSON文件下载链接。我能做的是使用Android应用程序下载它然后通过gson流式传输来解析内容。

但是当用户尝试下载价值1GB的大文件时,我发现了一个问题。

  1. 如果用户的互联网在下载过程中出现故障怎么办?
  2. 如果用户的设备突然耗尽空间怎么办?
  3. 根据上述情况,下载应该从头开始。

    为了解决这个问题,我想到了一个可能的解决方案,即将JSON分解为多个部分。因此,该应用程序可以检查是否已经下载了一部分,它只是简单意味着应用程序正在恢复它从上次下载的部分下载,从而节省数据和时间。

    我的问题是,如何拆分大json文件?它只是一个非常大的json文件没什么特别的。我使用PHP从mysql生成JSON文件,代码为:

    $fp = fopen($target_dir.'/json.json', 'w');
     fwrite($fp,json_encode(array('reading'=>$r,'book'=>$b,'article'=>$a,'month'=>$m, 'status'=>$status)));
            fclose($fp);
    

    然后通过以下方式生成链接:

    $file = $target_dir.'/json.json';
    
        if (file_exists($file)) {
            header('Content-Description: File Transfer');
            header('Content-Type: application/octet-stream');
            header('Content-Disposition: attachment; filename="'.basename($file).'"');
            header('Expires: 540');
            header('Cache-Control: must-revalidate');
            header('Pragma: public');
            header('Content-Length: ' . filesize($file));
            readfile($file);
            exit;
        }
    

    此外,如果我能够拆分JSON文件并为应用程序创建下载链接,我将如何通过Android应用程序加入它们?如果没有必要加入,我可以从块中解析它们吗?

    我不知道它是否是解决此类问题的最佳方法,但我注意到3D手机游戏,如真正的赛车和GTA san andreas下载大文件或者可能是一堆中等大小的文件需要一段时间才能完成。

2 个答案:

答案 0 :(得分:1)

创建大量文件的一种方法是使用fread() PHP函数。使用 fread ,我们可以指定要从文件中读取的字节数。所以你可以做的是在从数据库创建文件之后/创建文件时创建文件块。

这就是你可以创建块的方法。

$fp = fopen("jsonfile.txt",'r');
$i=1;
while(!feof($fp)) {
    $json_contents = fread($fp,4000);
    file_put_contents('json_chunk_'.$i.'.txt',$json_contents);
    $i++;
}

现在在Android应用程序中保留最后下载了哪个块的计数器,并在最后合并所有块。

如果在下载数据期间用户的互联网连接中断,这可能会解决问题。 / p>

答案 1 :(得分:0)

这取决于数据。 如果数据类似于带有ID的DB中的行,则客户端可以逐个下载ID,因此您不需要一行数据,只需要一行。当客户端在一行上丢失连接时,他们将重试该连接,直到没有更多数据。