Главная | Учебник | Статьи | FAQ | Книги | Ссылки |
Бинарные файлы нужно открывать с ключем "b", иначе в некоторых случаях файл считается текстовым. Обычно такое происходит под Windows, но если в Вашей системе параметр "b" не требуется, то он будет игнорироваться, поэтому рекомендуется его все-таки употреблять. Пример:
<? $fp = fopen("/home/rasmus/file.txt", "rb"); ?>
Потому что csv-файл должен удовлетворять одному, главному условию: текстовые поля должны быть ограничены кавычками, т.е. пример такого плана:
1, "Фамилия Имя Отчество", "Должность"
При отдаче файла через header("Location: somefile"), web сервер отдает еще Content-type этого файла, который узнается по расширению файла. Информация о соответствии content-а расширению берется web сервером из конфигурационного файла mime.types. Броузеры в зависимости от получаемого Content-type знают что дальше делать с этим файлом. При этом расширение файла броузеру ни о чем не говорит, и если web сервер отдаст, к примеру, файл best_music.mp3 с Content-type: application/msword, то, если в системе клиента установлен MS Word, этот файл будет открыт им.
Для решения проблемы описанной в вопросе существуют два способа:
1. Отредактировать файл mime.types поставив желаемым расширениям файлов (которые надо скачивать, а не открывать) в соответствие тип application/octet-stream.
Hедостатки:
2. Отдавать файл клиенту, не посредством header("Location: somefile"), а организовав собственную процедуру отдачи файла. При этом появляется возможность динамически менять Content-type, предоставив пользователю выбор, открыть ли файл в броузере или просто скачать, записав на диск.
Hедостатки:
В msdn нашел:
<? header("Content-Disposition: attachment; filename=work1.doc"); $x = fread(fopen("test.doc", "rb"), filesize("test.doc")); echo $x; ?>
Предполагается, что
<?php $filename = $cd."/".$fn; if (!file_exists($filename)) { header ("HTTP/1.0 404 Not Found"); exit; } $fsize = filesize($filename); $ftime = date("D, d M Y H:i:s T", filemtime($filename)); $fd = @fopen($filename, "rb"); if (!$fd){ header ("HTTP/1.0 403 Forbidden"); exit; } // Если запрашивающий агент поддерживает докачку if ($HTTP_SERVER_VARS["HTTP_RANGE"]) { $range = $HTTP_SERVER_VARS["HTTP_RANGE"]; $range = str_replace("bytes=", "", $range); $range = str_replace("-", "", $range); if ($range) {fseek($fd, $range);} } $content = fread($fd, filesize($filename)); fclose($fd); if ($range) { header("HTTP/1.1 206 Partial Content"); } else { header("HTTP/1.1 200 OK"); } header("Content-Disposition: attachment; filename=$fn"); header("Last-Modified: $ftime"); header("Accept-Ranges: bytes"); header("Content-Length: ".($fsize-$range)); header("Content-Range: bytes $range-".($fsize -1)."/".$fsize); header("Content-type: application/octet-stream"); print $content; exit; ?>
<? function XMail( $from, $to, $subj, $text, $filename) { $f = fopen($filename,"rb"); $un = strtoupper(uniqid(time())); $head = "From: $from\n"; $head .= "To: $to\n"; $head .= "Subject: $subj\n"; $head .= "X-Mailer: PHPMail Tool\n"; $head .= "Reply-To: $from\n"; $head .= "Mime-Version: 1.0\n"; $head .= "Content-Type:multipart/mixed;"; $head .= "boundary=\"----------".$un."\"\n\n"; $zag = "------------".$un."\nContent-Type:text/html;\n"; $zag .= "Content-Transfer-Encoding: 8bit\n\n$text\n\n"; $zag .= "------------".$un."\n"; $zag .= "Content-Type: application/octet-stream;"; $zag .= "name=\"".basename($filename)."\"\n"; $zag .= "Content-Transfer-Encoding:base64\n"; $zag .= "Content-Disposition:attachment;"; $zag .= "filename=\"".basename($filename)."\"\n\n"; $zag .= chunk_split(base64_encode(fread($f,filesize($filename))))."\n"; if (!@mail("$to", "$subj", $zag, $head)) return 0; else return 1; } ?>