2011-12-23 8 views
0

このフォーラムのユーザーコミュニティのおかげで、私は自分のインターネットブラウザ内からテキストファイルを見ることができる非常に単純なWebフォームを作成しました。フォームダウンロード同じZIP以上

私は今、検索によって返されたテキストファイルがZIPに圧縮される2つの機能を持っています。ここでの問題は、検索が最初に行われていたものは何でもから内容のZIPファイルには、何度も何度もダウンロードされてしまうことです私のコード

function getFilesFromSite() { 
    $result = null; 
    $ZIPresult = null; 
    if (empty($_POST['DBSite'])) { return null; } 
    $mydir = MYDIR; 
    $dir = opendir($mydir); 
    $DBSite = $_POST['DBSite']; 
    $getfilename = mysql_query("select filename from search_table where site='" . $DBSite . "'") or die(mysql_error()); 
    while ($row = mysql_fetch_array($getfilename)) { 
    $filename = $row['filename']; 
    $result .= '<tr><td><a href="' . basename($mydir) . '/' . $filename . '" target="_blank">' . $filename . '</a></td></tr>'; 
    $ZIPresult .= basename($mydir) . '/' . $filename.' '; 
    } 

    if ($result) { 
    $result = "<table><tbody><tr><td>Search Results.</td></tr> $result</table>"; 
    shell_exec("/bin/rm -f SearchResult.zip;/usr/bin/zip -9 SearchResult.zip ". $ZIPresult ." > /dev/null "); 

    //header for forced download 
    header("Pragma: public"); 
    header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1 
    header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past 
    $fileName = 'SearchResult.zip'; 
    header("Cache-Control: public"); 
    header("Content-Description: File Transfer"); 
    header("Content-Transfer-Encoding: binary"); 
    header('Content-type: application/zip'); 
    header("Content-length: " . filesize($fileName)); 
    header('Content-Disposition: attachment; filename="' . $fileName . '"'); 

    ob_start(); // Starts output buffering. 
    readfile($fileName); // "Outputs" the file. 
    $content = ob_get_flush(); // Grabs the output and assigns it to a variable. 
    print base64_encode($content); 
    } 

    function getFilesFromError() { 
//Just a copy paste from above with different input parameter... 
    } 

です。たとえば、後でgetFilesFromError()で検索しても、getFilesFromSite()の結果は常にダウンロードされます。

私のヘッダーが間違って設定されていると思われますが、どこがわからないのですか。

PS:私は代わりに、UnixのユーティリティのZIPを使用することを選択したように、新しいZIPARCHIVE()ライブラリ/クラスは、当社の生産環境では使用できません。

+0

スクリプトは実際に完全に実行されていますか?言い換えれば、途中でエラーが出ていますか?私の推測では、SearchResult.zipが作成されると、あなたの 'shell_exec'呼び出しがファイル権限エラーに陥っている可能性があります。 –

+0

そのようなコードをコピーして貼り付けないでください。ループを使用してください –

+1

ヘッダーはデータがバイナリであると言っていますが、base64は –

答えて

0

Base64を使用することは実際にはここで述べられている理由で実際には機能しませんでした。代わりに、私はzlib圧縮をオフにし、出力形式としてバイナリを使用するように戻しました。最後に、Content-Typeapplication/octet-streamに設定します。今はすべてうまくいっています。ここに私のコード:

function getFiles() { 
    ini_set('zlib.output_compression', 'Off'); 
    $result = null; 
    $ZIPresult = null; 
    $cleanup = null; 
    $output = null; 
    $fileName = null; 
    //remove old zip if any 
    $cleanup = shell_exec("/bin/rm -f SearchResult.zip"); 
    error_log("SHELL OUTPUT=>" . $cleanup, 0); 
    //test 
    if (empty($_POST['DBRIDs'])) { return null; } 
    $mydir = MYDIR; // set from the CONSTANT 
    $dir = opendir($mydir); 
    $DBRIDs = $_POST['DBRIDs']; 
    $getfilename = mysql_query("select /*! SQL_CACHE */ filename from automation where rid in (" . $DBRIDs . ")") or die(mysql_error()); 
    while ($row = mysql_fetch_array($getfilename)) { 
    $filename = $row['filename']; 
    $result .= '<tr><td><a href="' . basename($mydir) . '/' . $filename . '" target="_blank">' . $filename . '</a></td></tr>'; 
    $ZIPresult .= basename($mydir) . '/' . $filename.' '; 
    } 

    if ($result) { 
    $result = "<table><tbody><tr><td>Search Results.</td></tr> $result</table>"; 
    $output = shell_exec("/usr/bin/zip SearchResult.zip ". $ZIPresult ." "); 
    error_log("SHELL OUTPUT=>" . $output, 0); 
    $fileName = 'SearchResult.zip'; 
    error_log("ZIP FILENAME=>" . $fileName, 0); 

    if (file_exists($fileName)) { 
    //header for forced download 
     header('Content-Description: File Transfer'); 
     header('Content-Type: application/octet-stream'); 
     header('Content-Disposition: attachment; filename='.basename($fileName)); 
     header('Content-Transfer-Encoding: binary'); 
     header('Expires: 0'); 
     header('Cache-Control: must-revalidate'); 
     header('Pragma: public'); 
     header('Content-Length: ' . filesize($fileName)); 
     ob_clean(); 
     flush(); 
     readfile($fileName); 
     exit; 
     } 
    } 

    return $result; 
    } 

すべての時間を取ってくれてありがとう!

関連する問題