file_get_contents 大文件上传

use*_*068 2 php

我正在尝试使用 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)

mle*_*eko 7

file_get_contents将整个文件的内容作为单个字符串变量返回。在您的情况下,这意味着它将尝试创建 2\xc2\xa0GB 变量,该变量会耗尽允许的脚本内存。

\n

尝试使用fopenfgets。这将允许您以较小的块处理文件。

\n
$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