我一直致力于为最初用PHP 4.4.9编写的网站添加功能。将网站移植到PHP5并不是他们的预算,所以甚至不建议它。 (虽然它需要它很糟糕)。我面临的问题是如何将二进制数据从GET请求复制到服务器上的文件位置。当前为支持此方法而编写的代码如下:
function save($path) {
$input = fopen("php://input", "r");
$temp = tmpfile();
$realSize = stream_copy_to_stream($input, $temp);
fclose($input);
if ($realSize != $this->getSize()){
return false;
}
$target = fopen($path, "w");
fseek($temp, 0, SEEK_SET);
stream_copy_to_stream($temp, $target);
fclose($target);
}
我遇到的问题是函数stream_copy_to_stream
仅在PHP 5中受支持。这是我到目前为止所做的,但它似乎只创建了大小为8K的文件而且我是不知道为什么。从理论上讲,它应该允许高达20M。
function save($path) {
$input = fopen("php://input", "rb");
$temp = tmpfile();
fwrite($temp, fread($input, 20971520));
fclose($input);
$target = fopen($path, "w");
fseek($temp, 0, SEEK_SET);
#stream_copy_to_stream($temp, $target);
fwrite($target, fread($temp, 20971520));
fclose($target);
echo $path;
return true;
}
我删除了尺寸检查,因为在阅读时我找不到获取文件大小的方法。任何帮助都非常感谢。几个小时以来我一直在绞尽脑汁,我知道那里有人,很可能是在stackoverflow上,可能很容易回答我的问题。
提前感谢您的所有帮助!
此外,我通过GET提交数据,以允许使用进度条等多个文件上传。
答案 0 :(得分:2)
我遇到了这个线程,寻找完全相同问题的答案
我知道帖子已经过时但是在这里给别人看答案
你很亲密
fread一次仅从8192 byte chunks开始流出。所以你必须循环直到它看到文件结束。
function save($path) {
$input = fopen("php://input", "rb");
$temp = tmpfile();
while(!feof($input))
fwrite($temp, fread($input, 8192));
//fwrite($temp, fread($input, 20971520));
fclose($input);
$target = fopen($path, "w");
fseek($temp, 0, SEEK_SET);
#stream_copy_to_stream($temp, $target);
while(!feof($temp))
fwrite($target, fread($temp, 8192));
fclose($target);
echo $path;
return true;
}