【问题标题】:Copy file from url to my own server remains file to 0mb将文件从 url 复制到我自己的服务器仍然文件到 0mb
【发布时间】:2014-10-22 20:01:24
【问题描述】:

我遇到了一个问题,我不确定这是否是正确的做法。我需要使用 php 将文件从远程服务器复制到我的服务器。 我使用以下脚本:

public function download($file_source, $file_target) {
    $rh = fopen($file_source, 'rb');
    $wh = fopen($file_target, 'w+b');
    if (!$rh || !$wh) {
        return false;
    }

    while (!feof($rh)) {
        if (fwrite($wh, fread($rh, 4096)) === FALSE) {
            return false;
        }
        echo ' ';
        flush();
    }

    fclose($rh);
    fclose($wh);

    return true;
}

但最终,文件大小仍为 0。

编辑:我更新了我的问题,因为还有一些我不明白的东西: 关于 fread,我使用了 2048mb。但它没有用。 我找到了上面的脚本,它使用了 4096mb。

我的问题:如何确定要使用多少内存(?)才能随时下载文件?因为这个可以在特定的机器(专用)上工作,但是如果我不能修改 php.ini,它会在共享主机上工作吗?

再次感谢

【问题讨论】:

    标签: php copy filesize fread


    【解决方案1】:

    filesize() 需要一个文件名/路径。您正在传递一个文件句柄,这意味着文件大小将失败并返回一个布尔值 false。

    然后你使用这个 false 作为你的 fread 的大小参数,它被转换为整数 0。所以基本上你坐在那里告诉 php 读取一个文件,一次 0 个字节。

    无论如何,您无法可靠地获取远程文件的大小,因此只需 fread 一些固定数量的字节,例如2048,一次。

    while(!feof($handle)) {
       $contents = fread($handle, 2048);
       fwrite($f, $contents);
    }
    

    如果该文件不是太大并且/或者您的 PHP 可以处理它:

    file_put_contents('local.mp4', file_get_contents('http://whatever/foo.mp4'));
    

    【讨论】:

    • 好吧,你是对的。但只是要知道,因为这让我有点困惑:2048 到底指的是什么?因为在php doc中它被称为要读取的长度,并且当它到达文件末尾或达到长度时它会停止读取。
    • 正是如此。你不知道你得到的文件有多大,你也不需要知道。你只需要告诉 PHP 它实际上应该得到多少,即 2048。如果你重复这样做,那么你应该将这个数字调整为适合你特定网络数据包大小的值。
    • 您好,实际上它不起作用。我必须再次刷新或启动脚本才能使其正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-08
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-28
    相关资源
    最近更新 更多