2010-01-25 4 views
0

단일 CSV 파일이 포함 된 웹 서버에서 zip 파일을 다운로드 한 다음로드하려면 PHP 스크립트를 작성하려고합니다. 추출 된 CSV 파일의 내용을 기존 MySQL 데이터베이스 테이블에 저장합니다.압축 된 CSV를 압축 해제하고 CSV 파일의 내용을 MySQL 테이블에 가져 오는 방법

$targetFile = 'data-' . md5(microtime()) . '.zip'; 
$url = 'http://www.address.com/data.zip'; 
$out = fopen('/path/to/zip/save/folder/' . $targetFile , 'wb'); 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_FILE, $out); 
curl_setopt($ch, CURLOPT_HEADER, false); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_exec($ch); 

$info = curl_getinfo($ch); 

if($info['http_code'] == 200 && $info['content_type'] == 'application/x-zip-compressed') { 
    $zh = zip_open('/path/to/zip/save/folder/' . $targetFile); 
} 
else { 
    exit('Download of ZIP file failed.'); 
} 

위의 코드는 고유 한 이름으로 서버의 디렉토리에 파일을 다운로드 할 수 있습니다. 그러나 내용을 추출 할 수 없습니다.

PHP의 zip_open 명령을 사용하여 압축을 풀어 보았지만 항상 핸들 대신 오류 코드 을 반환했습니다. 내가 zip_open 함수에 전달한 경로를 확인한 결과 전체 시스템 경로가 /path/to/zip/save/folder/data-5384e2306718492958f20e68de95c6fa.zip입니다.

참고 :

CSV 파일 파일 압축 2.5 MB 및 비 압축 30메가바이트입니다.

+1

data-5384e2306718492958f20e68de95c6fa.zip을 컴퓨터에 다운로드하면 WinZip이나 좋아하는 편집기로 열 수 있습니까? – vicatcu

+0

예 할 수 있습니다. 그러나 그것은이 문제에 도움이되지 않을 것입니다. 이 스크립트는 CRON을 통해 하루에 한 번 실행되므로 수동 개입이 필요하지 않습니다. – Camsoft

답변

0

내가 우편을 열려고하기 전에 문제가 누락 fclose 전화 때문 보인다 파일.

1

zip_open() 오류 번호 19는 "Zip 파일 함수 오류 : zip 아카이브가 아닙니다."입니다. 즉, 스크립트가 zip 파일을 제대로 다운로드하지 못했음을 의미합니다.

+1

zip_open 코드를 포함하도록 예제를 업데이트했습니다. 여전히 19를 반환합니다. 그러나 파일이 폴더에서 파일을 볼 수 있고 Windows를 사용하여 내용을 추출 할 수 있으므로 성공적으로 다운로드 한 것 같습니다. – Camsoft

2

내용을 파일로 저장하기 전에 응답 헤더를 제거해야합니다. 또한 HTTP/1.1 200 OK 응답 또는 301/302 리디렉션이 있는지 확인할 수 있습니다.

0

$ url = "http://www.some.zip"; $ target = 'data-' md5 (마이크로 시간()). '.지퍼';

function download($src, $dst) { 
     $f = fopen($src, 'rb'); 
     $o = fopen($dst, 'wb'); 
     while (!feof($f)) { 
      if (fwrite($o, fread($f, 2048)) === FALSE) { 
        return 1; 
      } 
     } 
     fclose($f); 
     fclose($o); 
     return 0; 
} 
download($url,$target); 
if (file_exists($target)){ 
    # do your unzipping.. 
} 
+0

ZIP 파일이 2.5 MB이고 CSV 파일이 25 MB의 압축 파일을 압축 해제했기 때문에이 파일을 사용하는 것이 걱정됩니다. – Camsoft

0

난 당신이

에서 픽업 할 수 있어야한다이

$r = new HTTPRequest($url); 
    $r->setOptions($options); 
    $r->send(); 
    $code = $r->getResponseCode(); 
    if (200 != $code) { 
     throw ...; 
    } 

    file_put_contents($zip, $r->getResponseBody()); 

    $arc = new ZipArchive; 
    if (true !== $arc->open($zip)) { 
     throw ...; 
    } 
    file_put_contents($out, $arc->getFromIndex(0)); 

사용

관련 문제