2016-06-21 1 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

파일 청크를 만드는 한 가지 방법은 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를 하나씩 다운로드 할 수 있으므로 데이터 행은 필요 없으며 행만 필요합니다. 클라이언트가 한 행에서 연결이 끊어지면 더 이상 데이터가 없어 질 때까지 해당 행을 다시 시도합니다.

관련 문제