Первый проект PHP и я застреваем!
Я хочу позволить пользователям нажимать кнопку или ссылку и загружать файл.
Однако мой PHP должен сначала выполнить некоторые задачи, выбрать правильный файл, записать событие загрузки в дб и т.д. Это, я могу сделать, но как я затем отправляю файл как ответ на щелчок пользователя?
Спасибо за любую справку.
header("Content-type: image/png");
(или что там у вас), а затем просто выводите файл.
Отправьте соответствующий заголовок в вашем скрипте:
header("content-type: application/pdf");
Используйте правильный mime-type
согласно вашему файлу и отправьте содержимое в браузер, используя readfile
.
Как @Sarfraz предполагает, вы можете,после выполнения задач, которые вам нужно выполнить, отправьте заголовок Content-Type
в браузер, а затем извергайте содержимое файла в браузер. Затем браузер будет работать в соответствии с пользовательскими настройками, которые, как правило, будут либо а) открывать и отображать файл, либо б) сохранять файл на диск.
Если вы хотите принудительно сохранить файл на диск, а не отображать его в браузере, обычно используется способ указать MIME-тип Content-Type: application/octet-stream
. Можно также указать имя файла вложения с заголовком Content-Disposition: attachment; имя_файла=foobar.baz
.
Вот функция, которую можно использовать для отправки файлов непосредственно в браузер.
$ fileName
: путь + имя файла, который необходимо отправить в браузер
$ downloadName
: это имя (путь не требуется) файла что пользователь видит при загрузке (не обязательно то же самое, что $ filename
function sendFileDirectlyToBrowser($downloadName, $fileName) {
if (! file_exists($fileName)) {
throw new Exception('file does not exist!');
}
$pathInfo = pathinfo($fileName);
//list with mime-types http://en.wikipedia.org/wiki/Mime_type#List_of_common_media_types
switch (strtolower($pathInfo['extension'])) {
case 'csv':
header("Content-type: test/csv");
break;
case 'doc':
case 'docx':
header("Content-type: application/msword");
break;
case 'gif':
header("Content-type: image/gif");
break;
case 'jpg':
case 'jpeg':
header("Content-type: image/jpeg");
break;
case 'png':
header("Content-type: image/png");
break;
case 'pdf':
header("Content-type: application/pdf");
break;
case 'tiff':
header("Content-type: image/tiff");
break;
case 'txt':
header("Content-type: text/plain");
break;
case 'zip':
header("Content-type: application/zip");
break;
case 'xls':
case 'xlsx':
if(!(strpos($HTTP_USER_AGENT,'MSIE') === false)) {
header("Content-type:application/x-msdownload");
}
else {
header("Content-type:application/vnd.ms-excel ");
}
break;
}
header('Content-Disposition:attachment;filename="' . $downloadName . '"');
print file_get_contents($fileName);
}