Reputation: 1695
I wrote a very simple web form that allows my user to view text files from within their Internet browser.
I implemented a feature whereby the text files returned by the search are compressed into a ZIP. Here's my code
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;
}
It works great If I download the ZIP file from the server using FTP (for example) but I force the download from the page header, the ZIP is corrupted.
What am I missing? Thanks for your input.
PS: The new ZipArchive() library/class is not available on our production environment so I chose to use the Unix utility ZIP instead.
Upvotes: 0
Views: 1387
Reputation: 13279
It might be an encoding problem. Try encoding it with Base64.
Header:
header('Content-Transfer-Encoding: base64');
Then, to throw the file base64_encoded()ed to the browser, try the following:
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.
Note that simply base64_encode(readfile($fileName))
won't work because readfile() outputs data but doesn't return it.
Hope it helps!
Upvotes: 1