Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 正在使用fopen()、fread()、feof()下载文件。。。下载的文件已损坏_Php - Fatal编程技术网

Php 正在使用fopen()、fread()、feof()下载文件。。。下载的文件已损坏

Php 正在使用fopen()、fread()、feof()下载文件。。。下载的文件已损坏,php,Php,我有一个脚本,可以从服务器下载的文件,一切都很好。但是当文件被下载时,它要么是jpg文件,要么是png文件。我似乎无法用任何程序打开它来查看它。(windows照片库或焰火) 当我下载视频文件(avi)时。我不能用windows media player打开它,但我可以用vlc media player打开它 我总是收到错误消息,无法读取文件或文件损坏 这是代码,是可靠的还是应该考虑使用FSoCKOPEN或CURL?< /P> 我尝试过改变标题,在网上寻找更多答案,但运气不佳 有人知道怎么回事吗

我有一个脚本,可以从服务器下载的文件,一切都很好。但是当文件被下载时,它要么是jpg文件,要么是png文件。我似乎无法用任何程序打开它来查看它。(windows照片库或焰火)

当我下载视频文件(avi)时。我不能用windows media player打开它,但我可以用vlc media player打开它

我总是收到错误消息,无法读取文件或文件损坏

这是代码,是可靠的还是应该考虑使用FSoCKOPEN或CURL?< /P> 我尝试过改变标题,在网上寻找更多答案,但运气不佳

有人知道怎么回事吗

chmod("extensions_img/test.jpg",0755);

$fullPath = "http://www.website_url.com/extensions_img/test.jpg";

if ($fd = fopen ($fullPath, "r")) {

    $fsize = filesize("extensions_img/test.jpg");

    $path_parts = pathinfo($fullPath);
    $ext = strtolower($path_parts["extension"]);

    switch($ext) {

        case "pdf":
            $ctype = "application/pdf";
            break;
        case "exe":
            $ctype = "application/octet-stream";
            break;
        case "zip":
            $ctype = "application/zip";
            break;
        case "doc":
            $ctype = "application/msword";
            break;
        case "xls":
            $ctype = "application/vnd.ms-excel";
            break;
        case "ppt":
            $ctype = "application/vnd.ms-powerpoint";
            break;
        case "gif":
            $ctype = "image/gif";
            break;
        case "png":
            $ctype = "image/png";
            break;
        case "jpeg":
            $ctype = "image/jpg";
            break;
        case "jpg":
            $ctype = "image/jpg";
            break;
        case "mp3":
            $ctype = "audio/mp3";
            break;
        case "wav":
            $ctype = "audio/x-wav";
            break;
        case "wma":
            $ctype = "audio/x-wav";
            break;
        case "mpeg":
            $ctype = "video/mpeg";
            break;
        case "mpg":
            $ctype = "video/mpeg";
            break;
        case "mpe":
            $ctype = "video/mpeg";
            break;
        case "mov":
            $ctype = "video/quicktime";
            break;
        case "avi":
            $ctype = "video/x-msvideo";
            break;
        case "src":
            $ctype = "plain/text";
            break;
        default:
            $ctype = "application/force-download";
    }

    header("Pragma: public");

    header("Expires: 0");

    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");

    header("Cache-Control: private",false);

    header("Content-type: " . $ctype);

    header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\"");

    header("Content-Transfer-Encoding: binary");

    header("Content-length: $fsize");
    header("Cache-control: public"); //use this to open files directly

    while(!feof($fd)) {
        $buffer = fread($fd, 4096);
    flush();
    }
}
fclose ($fd);

您正在发送一个
内容长度:
标题,其中包含错误获取的文件大小

// You are opening a remote file:
$fullPath = "http://www.website_url.com/extensions_img/test.jpg";

// You are retrieving the filesize of a local file that may or may not exist
$fsize = filesize("extensions_img/test.jpg");
因此,您的
内容长度很可能如下所示:

 header("Content-length: 0");
…除非您有一个同名的实际本地文件,否则您将提供其文件大小,而不是预期的远程文件

根据,支持一些URL包装器。您可以尝试从远程文件检索文件大小:

从PHP5.0.0开始,这个函数也可以与一些URL包装器一起使用。请参阅支持的协议和包装以确定
哪些包装器支持stat()系列功能


您正在发送一个
内容长度:
标题,其中包含错误获取的文件大小

// You are opening a remote file:
$fullPath = "http://www.website_url.com/extensions_img/test.jpg";

// You are retrieving the filesize of a local file that may or may not exist
$fsize = filesize("extensions_img/test.jpg");
因此,您的
内容长度很可能如下所示:

 header("Content-length: 0");
…除非您有一个同名的实际本地文件,否则您将提供其文件大小,而不是预期的远程文件

根据,支持一些URL包装器。您可以尝试从远程文件检索文件大小:

从PHP5.0.0开始,这个函数也可以与一些URL包装器一起使用。请参阅支持的协议和包装以确定
哪些包装器支持stat()系列功能

尝试:

您没有回显任何内容,因此您的文件可能是空的?

请尝试:

您没有回显任何内容,因此您的文件可能是空的?

使用将下载文件两次。而且不知道为什么要使用
fopen/fread
,当存在或
fpassthru
时:

$data = file_get_contents($url);
$size = strlen($data);
$mime = current(preg_grep('/^Content-Type:/i', $http_response_header));
请注意这也是如何获得正确的MIME类型的(为了简单起见,只需通过
标题传递整个stirng)。甚至所有的标题。

使用将下载文件两次。而且不知道为什么要使用
fopen/fread
,当存在或
fpassthru
时:

$data = file_get_contents($url);
$size = strlen($data);
$mime = current(preg_grep('/^Content-Type:/i', $http_response_header));


请注意这也是如何获得正确的MIME类型的(为了简单起见,只需通过
标题传递整个stirng)。甚至是所有的标题。

尝试使用文本文件,然后查看文件的内容。可能是有PHP错误消息将输出到缓冲区,因此它们正在破坏文件。
$fsize
始终是
0
,因为文件不存在。请尝试使用文本文件执行此操作,然后查看文件的内容。可能是有PHP错误消息将输出到缓冲区,因此它们正在破坏该文件。
$fsize
始终是
0
,因为该文件不存在。感谢您的快速回复。我最初设置$fsize=filesize($fullpath);但是它抛出了以下错误(警告:filesize():stat失败)。但是如果我保留$fsize=filesize(“extensions_img/test.jpg”);我注意到文件的完整大小已被下载。@MortenHøgseth如果您无法通过http获得文件大小,我相信您必须先下载文件并在本地保存,然后再将其流式传输到客户端。如果省略
Content length
头文件,是否有效?您可以使用cURL从提供它的服务器获取内容长度。仔细看,我发现只下载了一半大小的文件。有内容长度标题和没有内容长度标题。我也知道。一个php文件,当我打开它时,我注意到从大约第15行开始,文本被剪切并删除。但是thx的答复,我会看看我是否可以调试我的方式,以找出什么是错误的文件。当我发现有什么问题时,我会回来发帖的。谢谢你的快速回复。我最初设置$fsize=filesize($fullpath);但是它抛出了以下错误(警告:filesize():stat失败)。但是如果我保留$fsize=filesize(“extensions_img/test.jpg”);我注意到文件的完整大小已被下载。@MortenHøgseth如果您无法通过http获得文件大小,我相信您必须先下载文件并在本地保存,然后再将其流式传输到客户端。如果省略
Content length
头文件,是否有效?您可以使用cURL从提供它的服务器获取内容长度。仔细看,我发现只下载了一半大小的文件。有内容长度标题和没有内容长度标题。我也知道。一个php文件,当我打开它时,我注意到从大约第15行开始,文本被剪切并删除。但是thx的答复,我会看看我是否可以调试我的方式,以找出什么是错误的文件。当我发现有什么问题时会回来发帖。thx samura完全解决了这个问题=)…我尝试使用while(!feof($fd)){$buffer=fread($fd,4096);echo$buffer;flush();}但是你的方法。。。救生员一直在处理这个问题。thx….顺便说一句,donno负1发生了什么,也许我按了sry.thx samura,完全解决了这个问题()…我尝试使用while(!feof($fd)){$buffer=fread($fd,4096);echo$buffer;flush();}但是你的方法。。。救生员一直在处理这个问题。thx…,顺便说一句,不知道负1发生了什么,也许我会点击sry.thx作为回复,我会阅读文件内容和fpassthru函数。在这种情况下,文件内容不是一个好主意,a)它会阅读整个文件