2017-06-12 51 views
1

我想創建並下載一個zip文件低谷PHP。我的代碼在所有可用的dispositive中都很好,除了在mac中。當一個mac用戶試圖下載文件時,瀏覽器在幾分鐘後引發「空響應」錯誤。該壓縮文件大小是可變的,但始終是附近的1.5Gb下載使用PHP一個zip文件在Mac計算機

這是JavaScript函數iniciates zip創建和下載這一個:

var peticion = ConstructorXMLHttpRequest(); 
if (peticion){ 
     disableButtons(); 
     peticion.open('POST', './php/createzip.php'); 
     peticion.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
     peticion.onreadystatechange = function() { //llama a una funcion cuando el estado cambia 
      if(peticion.readyState == 4 && peticion.status == 200) { 
       window.location.href = './php/download.php?az='+id_windturbine; 
       enableButtons(); 
      } 
     } 

創造的zip文件中的代碼(不在BBDD查詢)是thisone:

while($row = mysqli_fetch_row($result)){ 
     $url = '../'.$url1.$url2.'/'.$row[0]; 
     if ($gestor = opendir($url)){ 
      while (false !== ($entrada = readdir($gestor))){ 
       if (strpos($entrada,"full.png")!==false){ 
        $files[] = $url.$entrada; 
       } 
      } 
      closedir($gestor); 
     } 
    } 

    $zip = new ZipArchive; 
    $fecha = date('YmdGis'); 
    mkdir('../temp/'.$id_user.'_'.$fecha); 
    $zipname = '/var/www/html/temp/'.$id_user.'_'.$fecha.'/images.zip'; 
    $zip->open($zipname,ZIPARCHIVE::CREATE); 
    foreach ($files as $file) { 
     $zip->addFile($file); 
    } 
    $zip->close(); 
    mysqli_close($db); 
    $_SESSION['zipaero'.$id_windturbine]=$zipname; 

當這個PHP文件結尾的話,因爲它可以在js文件中可以看出,下載的文件被啓動。

include('sesion.php'); 
    $aero=$_GET['az']; 
    $zipname = $_SESSION['zipaero'.$aero]; 
    if(file_exists($zipname)){ 
     stream($zipname); 
     unset($_SESSION['zipaero'.$aero]); 
    }else{ 
     echo "El fichero $zipname no existe"; 
    } 
    function stream($url){ 
     header('Content-Description: File Transfer'); 
     header('Content-Type: application/zip'); 
     header('Content-disposition: attachment; filename="images.zip"'); 
     header('Expires: 0'); 
     header('Cache-Control: must-revalidate'); 
     header('Pragma: public'); 
     header('Content-Length: ' . filesize($url)); 
     $archivo = fopen($url,"r"); 
     if (!($archivo===false)){ 
      while(!feof($archivo)){ 
       //imprimir contenido del archivo cada 1KB (kilobyte) 
       print(fread($archivo, 1024)); 
       //decirle a apache que ya puede enviarlo 
       ob_flush(); 
       flush(); 
      } 
     } 
     //cerrar el puntero al archivo 
     fclose($archivo); 
    } 

有沒有人有過同樣的問題,並知道如何解決它? 我認爲這個問題是因爲createzip.php腳本執行持續較長時間(3分鐘),但我真的不知道如何解決它。

在此先感謝

---編輯新的信息---

我試圖通過維韋克D.提供兩倍的代碼。第一個下載開始,但後來停止在141Mb。

error1 error2

第二個提出的mentionated空響應

error3

已擦除window.location.href是」 ./php/download.php?az='+id_windturbine正如你在代碼中看到的那樣。 (捕獲來自生產服務器)

我不知道這是否會有所幫助,但這是我用於AJAX調用的代碼。

function ConstructorXMLHttpRequest() 
{ 
    if(window.XMLHttpRequest) /*Vemos si el objeto window posee el metodo XMLHttpRequest(Navegadores como Mozilla y Safari).*/ 
    { 
     return new XMLHttpRequest(); //Si lo tiene, crearemos el objeto 
    } 

    else if(window.ActiveXObject) /*Sino tenia el metodo anterior,deberia ser el Internet Exp.*/ 
    { 
     var versionesObj = new Array(
            'Msxml2.XMLHTTP.5.0', 
            'Msxml2.XMLHTTP.4.0', 
            'Msxml2.XMLHTTP.3.0', 
            'Msxml2.XMLHTTP', 
            'Microsoft.XMLHTTP'); 

     for (var i = 0; i < versionesObj.length; i++) 
     { 
      try 
       { 
        return new ActiveXObject(versionesObj[i]); 
       } 
       catch (errorControlado) 
       { 

       } 
     } 
    } 
    throw new Error("No se pudo crear el objeto XMLHttpRequest"); 
} 
+0

你確定這不是Mac/PC的問題,而是瀏覽器的問題? Mac的用戶經常使用Safari。也許你可以嘗試使用MAC + FF(或Chrome)? – Xenofexs

+0

你好,謝謝你的答案。爲避免Safari瀏覽器,我們要求用戶在所有計算機上始終使用chrome。我們也正在使用Chrome在Mac電腦上測試此功能,但仍然顯示錯誤。 – Pharaun

回答

2

請嘗試下面的代碼。

function stream($url){ 
     header('Content-Description: File Transfer'); 
     header('Content-Type: application/octet-stream'); 
     header('Content-Disposition: filename=image.zip'); 
     header("Content-Transfer-Encoding: Binary"); 
     header('Expires: 0'); 
     header('Cache-Control: must-revalidate'); 
     header('Pragma: public'); 
     header('Content-Length: ' . filesize($url)); 
     $archivo = fopen($url,"r"); 
     if (!($archivo===false)){ 
      while(!feof($archivo)){ 
       print(fread($archivo, 1024)); 
       flush(); 
      } 
     } 
     //cerrar el puntero al archivo 
     fclose($archivo); 
    } 
+0

請給你的答案添加一個解釋。 **爲什麼**會讓你的代碼解決問題? – DanFromGermany

+0

感謝您的回答。我剛剛嘗試了兩次你的代碼,並得到了兩個不同的錯誤。在第一個下載開始,但停在146mb。第二個提出了空的迴應錯誤。我將用新的信息編輯我的問題。 – Pharaun

+0

您需要對php.ini文件進行以下配置更改: Memory_limit - 640M Max_execution_time - 1800 如果執行時間不起作用,則將執行時間增加到更高的值。 –