目前我有一个大小为1GB的大型JSON文件下载链接。我能做的是使用Android应用程序下载它然后通过gson流式传输来解析内容。
但是当用户尝试下载价值1GB的大文件时,我发现了一个问题。
根据上述情况,下载应该从头开始。
为了解决这个问题,我想到了一个可能的解决方案,即将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下载大文件或者可能是一堆中等大小的文件需要一段时间才能完成。
答案 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,因此您不需要一行数据,只需要一行。当客户端在一行上丢失连接时,他们将重试该连接,直到没有更多数据。