2010-01-25 42 views
0

我試圖寫一個PHP腳本下載從包含一個CSV文件,然後負載Web服務器的zip文件將提取的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,但它總是返回錯誤代碼19而不是句柄。我檢查了傳遞給zip_open函數的路徑,它是一個完整的系統路徑,即/path/to/zip/save/folder/data-5384e2306718492958f20e68de95c6fa.zip

注:

CSV文件文件是2.5 MB壓縮到30 MB壓縮。

+1

如果您將data-5384e2306718492958f20e68de95c6fa.zip下載到您的計算機,您是否可以用WinZip或您最喜歡的編輯器打開它。 – vicatcu 2010-01-25 18:39:45

+0

是的,我可以做到這一點。但是這不會幫助我解決這個問題。該腳本每天通過CRON運行一次,因此不需要手動干預。 – Camsoft 2010-01-26 09:43:15

回答

0

看來這個問題是由於缺少fclose電話之前,我試圖打開ZIP文件。

1

zip_open()錯誤編號19的是: 「Zip文件功能錯誤:沒有一個zip壓縮文件」。這意味着您的腳本沒有正確下載zip文件。

+1

我已更新我的示例以包含zip_open代碼。它仍然會返回19.但是該文件確實似乎已經下載成功,因爲我可以在該文件夾中看到該文件並使用Windows提取它的內容。 – Camsoft 2010-01-26 10:24:20

2

請記住在將內容另存爲文件之前剝去響應標頭。此外,您可以檢查是否有HTTP/1.1 200 OK響應,或者301/302重定向以跟蹤

0

$ url =「http://www.some.zip」; $ target ='data-'。 md5(microtime())。 '。壓縮';

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 2010-01-26 10:26:24

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)); 

,你應該能夠從那裏

把它撿起來
相關問題