Javascript 从服务器下载的文件(使用download.php);我打不开。为什么?

Javascript 从服务器下载的文件(使用download.php);我打不开。为什么?,javascript,php,html,download,Javascript,Php,Html,Download,我是初学者。我到处都搜索过,但我不知道为什么在通过客户端(Win7 Firefox)从服务器下载文件后,我无法打开该文件。我尝试了一个PNG文件和一个MP4文件。下载完成,但文件未打开。 这是我的剧本 $dl_file = $_GET['val']; //Verified the full path and the file name gets passed here $basename = basename($dl_file); $ext = pathinfo($dl_file, PATHIN

我是初学者。我到处都搜索过,但我不知道为什么在通过客户端(Win7 Firefox)从服务器下载文件后,我无法打开该文件。我尝试了一个PNG文件和一个MP4文件。下载完成,但文件未打开。 这是我的剧本

$dl_file = $_GET['val']; //Verified the full path and the file name gets passed here
$basename = basename($dl_file);
$ext = pathinfo($dl_file, PATHINFO_EXTENSION);
$length   = sprintf("%u", filesize($dl_file));

    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.$basename.'');
//manually tried '.$basename.'.PNG' - DID NOT work. How to pass $ext here?
        header('Content-Transfer-Encoding: binary');
        header('Connection: Keep-Alive');
        header('Expires: 0');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Pragma: public');
        header('Content-Length: ' . $length);

        set_time_limit(0);
        readfile($dl_file);
我无法想象为什么下载的文件无法打开。腐败吗?
请多解释一下。先谢谢你

经过多次尝试,我发现添加下面所示的两行代码(ob_clean和flush)(和/或添加precheck和postcheck参数)对所有浏览器都有效。谢谢

if (file_exists($dl_file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="'.basename($dl_file).'"' );
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . filesize($dl_file));
    ob_clean();
    flush();
    readfile($dl_file);
    exit;
}

经过多次尝试,我发现添加下面所示的两行代码(ob_clean和flush)(和/或添加precheck、postcheck参数)对所有浏览器都有效。谢谢

if (file_exists($dl_file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="'.basename($dl_file).'"' );
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . filesize($dl_file));
    ob_clean();
    flush();
    readfile($dl_file);
    exit;
}

你说不开门是什么意思?完成的文件大小正确吗?你试过下载一个简单的文本文件并打开它吗?也许试着把“hello world”放在一个文本文件中,然后下载这个文件。下载完成了,但是这些文件不能用播放器打开。一个视频文件(19.7M),1.mp4下载。它保存在我的硬盘上。我用VLC打开,但它没有。我只托管图像和视频文件。下载的PNG文件。使用Win照片查看器打开。它显示一个错误。“不支持格式”。很难说文件为什么会损坏,甚至一开始是否损坏。我们能够确定这是您的代码有问题的唯一方法,并且要知道原因,就必须像我描述的那样做一个简单的测试。把一个文本文件放到服务器上,然后下载,看看会发生什么,这应该不难。试着复制示例1中的代码,看看是否有效:你说的“不打开”是什么意思?完成的文件大小正确吗?你试过下载一个简单的文本文件并打开它吗?也许试着把“hello world”放在一个文本文件中,然后下载这个文件。下载完成了,但是这些文件不能用播放器打开。一个视频文件(19.7M),1.mp4下载。它保存在我的硬盘上。我用VLC打开,但它没有。我只托管图像和视频文件。下载的PNG文件。使用Win照片查看器打开。它显示一个错误。“不支持格式”。很难说文件为什么会损坏,甚至一开始是否损坏。我们能够确定这是您的代码有问题的唯一方法,并且要知道原因,就必须像我描述的那样做一个简单的测试。把一个文本文件放到服务器上,然后下载看看会发生什么,这应该不难。试着复制示例1中的代码,看看是否有效:谢谢,我添加了ob_clean();flush();。这对我来说很有效。我在为同样的问题寻找解决方案,这对我帮助很大@Zac1。谢谢,谢谢,我加了ob_clean();flush();。这对我来说很有效。我在为同样的问题寻找解决方案,这对我帮助很大@Zac1。谢谢