第一个PHP项目,我被卡住了!
我希望允许用户点击按钮或链接并下载文件。
但是,我的PHP必须首先执行一些任务,选择正确的文件,在db等中记录下载事件。我可以这样做,但是如何将文件作为对用户点击的响应发送?
感谢您的帮助。
答案 0 :(得分:2)
正如@Sarfraz建议的那样,在完成您需要完成的任务后,您可以向浏览器发送Content-Type
标题,然后将该文件的内容吐出到浏览器中。然后,浏览器将根据用户设置执行,通常是a)打开并显示文件或b)将文件保存到磁盘。
如果要强制将文件保存到磁盘而不是在浏览器中显示,常用的方法是指定mime-type Content-Type: application/octet-stream
。也可以使用标题Content-Disposition: attachment; filename=foobar.baz
指定附件文件名。
答案 1 :(得分:0)
答案 2 :(得分:0)
header("Content-type: image/png");
(或其他任何东西),然后输出文件。
答案 3 :(得分:0)
这是一个可用于将文件直接发送到浏览器的功能。
$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);
}