使用 BinaryFileResponse 的文件下载工作了一段时间,然后失败了
File download using BinaryFileResponse works for a while, then fails
我使用这个功能从我的服务器下载MP3文件;这些文件有几兆大,介于 1 到 10 兆之间。它工作得很好但是它在一段时间后停止工作,然后每当我们使用该函数时它都会永久引发错误(catch 部分),直到我重新启动 Web 服务器。一旦我重新启动它,它就会恢复正常运行。 Web 服务器是 OpenLiteSpeed 1.4。
请问我是否正确使用了 BinaryFileResponse 函数?
function getFile($user_id, $filename)
{
if (empty($filename)) {
throw new \InvalidArgumentException('Please provide a valid filename.');
} else {
$filepath = "../files/$filename";
BinaryFileResponse::trustXSendfileTypeHeader();
try {
$response = new BinaryFileResponse($filepath);
$mimeTypes = new MimeTypes();
$mimeType = $mimeTypes->guessMimeType($filepath);
$response->headers->set('Content-Type', $mimeType);
$response->setAutoEtag();
$response->setContentDisposition(
ResponseHeaderBag::DISPOSITION_ATTACHMENT,
$filename
);
} catch (FileNotFoundException $exception) {
$response = new JsonResponse(
['Status' => 'Error', 'Message' => DEBUG ? $exception->getMessage() : 'File not found.'],
Response::HTTP_NOT_FOUND
);
}
}
return $response;
}
我搜索了几个小时,但找不到答案,所以我决定采用一种完全不同的方法,但效果很好:
$filename = basename($filepath);
set_time_limit(0);
ini_set('memory_limit', '25M');
while (ob_get_level()) ob_end_clean();
header('Content-Type: audio/mpeg');
header('Content-Disposition: attachment; filename=' . basename($filepath));
header('Cache-Control: no-cache');
header("Content-Transfer-Encoding: chunked");
ob_flush();
flush();
readfile($filepath);
exit;
我使用这个功能从我的服务器下载MP3文件;这些文件有几兆大,介于 1 到 10 兆之间。它工作得很好但是它在一段时间后停止工作,然后每当我们使用该函数时它都会永久引发错误(catch 部分),直到我重新启动 Web 服务器。一旦我重新启动它,它就会恢复正常运行。 Web 服务器是 OpenLiteSpeed 1.4。
请问我是否正确使用了 BinaryFileResponse 函数?
function getFile($user_id, $filename)
{
if (empty($filename)) {
throw new \InvalidArgumentException('Please provide a valid filename.');
} else {
$filepath = "../files/$filename";
BinaryFileResponse::trustXSendfileTypeHeader();
try {
$response = new BinaryFileResponse($filepath);
$mimeTypes = new MimeTypes();
$mimeType = $mimeTypes->guessMimeType($filepath);
$response->headers->set('Content-Type', $mimeType);
$response->setAutoEtag();
$response->setContentDisposition(
ResponseHeaderBag::DISPOSITION_ATTACHMENT,
$filename
);
} catch (FileNotFoundException $exception) {
$response = new JsonResponse(
['Status' => 'Error', 'Message' => DEBUG ? $exception->getMessage() : 'File not found.'],
Response::HTTP_NOT_FOUND
);
}
}
return $response;
}
我搜索了几个小时,但找不到答案,所以我决定采用一种完全不同的方法,但效果很好:
$filename = basename($filepath);
set_time_limit(0);
ini_set('memory_limit', '25M');
while (ob_get_level()) ob_end_clean();
header('Content-Type: audio/mpeg');
header('Content-Disposition: attachment; filename=' . basename($filepath));
header('Cache-Control: no-cache');
header("Content-Transfer-Encoding: chunked");
ob_flush();
flush();
readfile($filepath);
exit;