2017-06-12 16 views
1

私はzipファイルトラフPHPを作成してダウンロードしようとしています。私のコードは、macを除いて、すべてのポッシブルディスポーザリでうまくいく。 Macユーザーがファイルをダウンロードしようとすると、ブラウザは数分後に「空の応答」エラーを表示します。 zipファイルのサイズは可変であるが、常に1.5GBMacコンピュータでPHPでzipファイルをダウンロード

これは、ZIPの作成やダウンロードをiniciates javascript関数であるに近いです、この1:

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; 

それはJSファイルに見られるように、このPHPファイルは、ダウンロードファイルが開始され、その後、終了します。

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分)続いたためだと思いますが、どうしたら解決するのか本当に分かりません。事前

おかげ

---新しい情報と編集---

私は二回のVivek 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

こんにちは、お返事ありがとうございます。サファリを避けるために、ユーザーにすべてのコンピュータで常にクロムを使用するように頼んだ。また、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

あなたの答えをありがとう。私はあなたのコードを2回試してみたところ、2つの異なるエラーがありました。 fisrt 1ではダウンロードが開始されたが、146MBで停止した。 2番目は空の応答エラーを発生させました。私は新しい情報で私の質問を編集します。 – Pharaun

+0

以下の設定のためにphp.iniファイルを変更する必要があります。 Memory_limit - 640M Max_execution_time - 1800 動作しない場合は実行時間を長くしてください。 –

関連する問題