2011-12-22 20 views
0

非常にシンプルなWebフォームを作成して、ユーザーがインターネットブラウザからテキストファイルを閲覧できるようにしました。ダウンロードが強制的にZIPファイルに破損する

私は、検索によって返されたテキストファイルが圧縮されてZIPになるという機能を実装しました。ここに私のコード

 function getFiles() { 
     $result = null; 
     $ZIPresult = null; 
     if (empty($_POST['DBRIDs'])) { return null; } 
     $mydir = MYDIR; 
     $dir = opendir($mydir); 
     $DBRIDs = $_POST['DBRIDs']; 
     $getfilename = mysql_query("select filename from search_table 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>"; 
     shell_exec("zip -9 SearchResult.zip ". $ZIPresult ." > /dev/null "); 

$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 . '"'); 
readfile($fileName); 
     } return $result; 
     } 

は、私が(例えば)FTPを使用して、サーバーからZIPファイルをダウンロードした場合はそれは素晴らしい作品が、私はZIPが破損している、ページヘッダからのダウンロードを強制です。

私には何が欠けていますか?あなたのご意見ありがとうございます。

PS:新しいZipArchive()ライブラリ/クラスは私たちの実稼働環境では利用できないので、代わりにUnixユーティリティZIPを使用することにしました。

+0

テキスト/ 16進エディタを使用して、.zipファイルが破損している理由を確認しましたか?おそらくダウンロードしたデータに埋め込まれるPHPの警告があります。ファイルサイズはサーバーとクライアントで一致しますか? –

+0

@MarcB:あなたの最初の質問には、いいえ。はい、ファイルサイズはサーバーとクライアントの両方で一致します。 – Chris

答えて

1

エンコードに問題がある可能性があります。 Base64でエンコードしてみてください。

ヘッダー:単にbase64_encode(readfile($fileName))はのReadFile()出力するので動作しません

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

注:その後 header('Content-Transfer-Encoding: base64');

、ブラウザに)EDをBase64エンコードファイルを(スローするように、次のことを試してくださいデータは返さない。

希望すると助かります!

+0

ありがとうございます!エンコーディングが問題でした。受け入れられ、投票された。 – Chris

+0

助けてくれてうれしい! – Teekin

関連する問題