我正在尝试使用 fsockopen 上传 2GB 以上的大文件。但 file_get_content 出现以下错误,我无法在内存中存储大文件。我需要分块发送数据,但不知道如何执行此操作。请问有人可以指导我吗?
致命错误:允许的内存大小 134217728 字节已耗尽(尝试分配 727826869 字节)
$file_info = finfo_open(FILEINFO_MIME);
$mime_type = finfo_file($file_info, $file_loc);
$file = file_get_contents($file_loc);
$fp = fsockopen($host, 80, $errno, $errstr, 30);
if ($fp) {
$out = "POST /upload/".basename($url)." HTTP/1.1\r\n";
$out .= "Host: ".$host."\r\n";
$out .= "Accept-Language: en-US,en;q=0.8\r\n";
$out .= "Content-Type: ".$mime_type."\r\n";
$out .= 'Content-Length: ' . filesize($file_loc) . "\r\n";
$out .= "Content-Disposition: attachment; filename=\"".urlencode(basename($file_loc))."\"\r\n\r\n";
fwrite($fp, $out);
fwrite($fp, $file);
$response = '';
while (!feof($fp)) {
$response .= fgets($fp, 128);
}
fclose($fp);
Run Code Online (Sandbox Code Playgroud)
file_get_contents
将整个文件的内容作为单个字符串变量返回。在您的情况下,这意味着它将尝试创建 2\xc2\xa0GB 变量,该变量会耗尽允许的脚本内存。
尝试使用fopen
和fgets
。这将允许您以较小的块处理文件。
$file_info = finfo_open(FILEINFO_MIME); \n$mime_type = finfo_file($file_info, $file_loc); \n$fileHandle = fopen($file_loc);\n\n$fp = fsockopen($host, 80, $errno, $errstr, 30);\nif ($fp) {\n $out = "POST /upload/".basename($url)." HTTP/1.1\\r\\n";\n $out .= "Host: ".$host."\\r\\n";\n $out .= "Accept-Language: en-US,en;q=0.8\\r\\n";\n $out .= "Content-Type: ".$mime_type."\\r\\n";\n $out .= 'Content-Length: ' . filesize($file_loc) . "\\r\\n";\n $out .= "Content-Disposition: attachment; filename=\\"".urlencode(basename($file_loc))."\\"\\r\\n\\r\\n";\n\n fwrite($fp, $out);\n while(!feof($fileHandle)){\n fwrite($fp, fgets($fileHandle, 1024));\n }\n fclose($fileHandle);\n \n $response = '';\n while (!feof($fp)) {\n $response .= fgets($fp, 128);\n }\n fclose($fp);\n
Run Code Online (Sandbox Code Playgroud)\n
归档时间: |
|
查看次数: |
9491 次 |
最近记录: |