2016-06-21 13 views
0

現在、私は1GBのサイズの大きなJSONファイルダウンロードリンクを持っています。私ができることは、アンドロイドアプリを使用してダウンロードし、gsonを通してストリーミングするjsonのコンテンツを解析することです。サーバー側でJSONを分割し、クライアント側で結合してストリームする方法

しかし、1GBの大きなファイルをダウンロードしようとすると問題が発生しました。

  1. ダウンロード途中でユーザーのインターネットが壊れた場合はどうなりますか?
  2. ユーザーのデバイスの容量が不足している場合はどうなりますか?

上記のシナリオに基づいて、ダウンロードは最初から再開されます。

これを修正するために、私はJSONを部分に分解する可能な解決策を考えました。だから、アプリがすでにダウンロードされているかどうかを確認することができます。それはアプリが最後にダウンロードした部分からダウンロードを再開し、データと時間を節約することを意味します。

私の質問は、どうすれば大きなjsonファイルを分割できますか?それはちょうど非常に大きなjsonファイルで何も特別なものではありません。私は、JSONファイルを分割して作成することができるよ場合、

$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; 
    } 

さらに:

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

が次に経由でリンクを生成:私はコードでMySQLからJSONファイルを生成するためにPHPを使用していますアプリをダウンロードするためのリンクをダウンロードしてください。どうすればアンドロイドアプリに参加できますか?結合が必要ない場合、チャンクから解析できますか?

この種の問題のための最良のアプローチであるかどうかは分かりませんが、実際のレースやGTA san andreasのような3Dモバイルゲームは大きなファイルをダウンロードしたり、 。

答えて

1

ファイルのチャンクを作成する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++; 
} 

アンドロイドアプリでは、最後にチャンクがダウンロードされたカウンタを保持し、最後にすべてのチャンクをマージします。

これは、データのダウンロード中にユーザーのインターネット接続がダウンした場合に問題を解決する可能性があります。

+0

ありがとうございます!それでは、病気だけでクライアント側に参加してください。何かのような追加または何か –

+0

うまくいくはずです。 –

0

これはデータによって異なります。 データがIDを持つDBの行に似ている場合、クライアントはIDを1つずつダウンロードできます。したがって、データのまとまりは必要なくなり、行だけが必要になります。クライアントが1つの行で接続を失うと、データがなくなるまでそのクライアントは再試行します。

関連する問題