我正在尝试创建一个脚本,以便将文件id作为查询字符串传递给/下载。php url并强制下载该文件。url应如下所示http://website.com/download.php?file=123
下面是我的代码,但它会引导我进入404页面或显示错误无效响应
/**
* Download File from ID
*/
add_action(\'template_redirect\',\'cityportal_force_download\');
function cityportal_force_download() {
if ($_SERVER[\'REDIRECT_URL\']==\'/download.php\' && isset($_GET[\'file\']) && !empty($_GET[\'file\'])) {
$file_id = $_GET[\'file\'];
$file_path = get_attached_file($file_id);
$file_url = wp_get_attachment_url($file_id);
if(file_exists($file_path)) {
header(\'Content-Description: File Transfer\');
header(\'Content-Type: \'.mime_content_type($file_path));
header(\'Content-Disposition: attachment; filename="\'.basename($file_path).\'"\');
header(\'Expires: 0\');
header(\'Cache-Control: must-revalidate\');
header(\'Pragma: public\');
header(\'Content-Length: \' . filesize($file_path));
flush();
readfile($file_url);
die();
exit;
}
}
}
最合适的回答,由SO网友:Sally CJ 整理而成
出现错误的原因是WordPress试图解析请求,这意味着WordPress试图查找与请求URL匹配的资源,如帖子或类别存档(/download.php
), 如果找不到,WordPress会将HTTP状态标头设置为404找不到。
因此,要解决此问题,您可以使用parse_request
而不是template_redirect
, 或致电status_header()
设置其他标题时。例如。
if(file_exists($file_path)) {
status_header( 200 );
// ... your code.
}
顺便说一句,正如我在评论中所说的,你应该使用
readfile($file_path)
— 只是提醒一下。。