我在服务器上有一个PHP脚本将文件发送给配方:它们获得一个唯一的链接,然后他们可以下载大文件.有时传输出现问题,文件已损坏或永不完成.我想知道是否有更好的方法来发送大文件
码:
$f = fopen(DOWNLOAD_DIR.$database[$_REQUEST['fid']]['filePath'], 'r');
while(!feof($f)){
print fgets($f, 1024);
}
fclose($f);
Run Code Online (Sandbox Code Playgroud)
我见过的功能如
http_send_file
http_send_data
Run Code Online (Sandbox Code Playgroud)
但我不确定他们是否会奏效.
解决这个问题的最佳方法是什么?
问候
erwing
我正在使用php下载文件,而不是在新窗口中打开文件本身.它似乎适用于较小的文件,但不适用于大文件(我需要这个工作在非常大的文件).这是我下载文件的代码:
function downloadFile($file) {
if (file_exists($file)) {
//download file
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: '.filesize($file));
ob_clean();
flush();
readfile($file);
exit;
};
};
Run Code Online (Sandbox Code Playgroud)
但是当我尝试下载一个大文件(例如265mb)时,浏览器告诉我它无法找到该文件?这些文件肯定在服务器上,并且脚本适用于较小的文件.有没有办法下载类似于我已有的大文件?
我用PHP编写了一个下载脚本,直到昨天.今天我试着下载其中一个文件,发现它突然停止了工作:
PHP致命错误:第52行的E:\ home\tecnoponta\web\aluno\download.php中允许的内存大小为67108864字节(尝试分配119767041字节)
出于某种原因,PHP试图在内存中分配文件的大小,我不知道为什么.如果文件大小小于内存限制,我可以毫无问题地下载它,问题在于更大的文件.
我知道可以通过增加php.ini中的内存限制甚至在代码上使用ini_set来纠正它,但我想要一个更准确的方法来解决这个问题以及为什么它停止工作的答案.
这是我的代码:
$file = utf8_decode($_GET['d']);
header('Content-Description: File Transfer');
header('Content-Disposition: attachment; filename='.$file);
header('Content-Type: application/octet-stream');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
$file = "uploads/$curso/$file";
ob_clean();
flush();
readfile($file);
echo "<script>window.history.back();</script>";
exit;
Run Code Online (Sandbox Code Playgroud)