2012-06-02 39 views
0

我试图用php下载一些文件来隐藏文件路径,但是一些文件类型总是被破坏。 像PDF和MP3文件类型很好。 像doc,ppt,jpg等文件类型总是下载破碎。用php下载jpg,doc,ppt文件已损坏

我使用这些MIME类型

if (file_exists($file_real)){ 
$extension = strtolower(substr(strrchr($file, "."), 1)); 
switch($extension){ 
case "ppt": $type = "application/vnd.ms-powerpoint"; break; 
case "pdf": $type = "application/pdf"; break; //------ok 
case "doc": $type = "application/msword"; break; 
case "mp3": $type = "audio/mpeg"; break;//------ok 
case "jpg": $type = "image/jpg"; break; 
default: $type = "application/force-download"; break; 
} 

和这些头

header("Pragma: public"); 
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Cache-Control: public", false); 
header("Content-Description: File Transfer"); 
header("Content-Type: " . $type); 
header("Accept-Ranges: bytes"); 
header("Content-Disposition: attachment; filename=\"" . $header_file . "\";"); 
header("Content-Transfer-Encoding: binary"); 
header("Content-Length: " . filesize($file_real)); 
if ($stream = fopen($file_real, 'rb')){ 
      while(!feof($stream) && connection_status() == 0){ 
       set_time_limit(0); 
       print(fread($stream,1024*8)); 
       flush(); 
      } 
      fclose($stream); 
     } 
+0

你正在下载PPT/DOC或PPTX/DOCX? DocX内容类型是“application/vnd.openxmlformats-officedocument.wordprocessingml.document”,PPTX是“application/vnd.openxmlformats-officedocument.presentationml.presentation” – AvkashChauhan

+0

你打开和输出文件的方式是什么? – user2428118

+0

使用word2003创建的Doc文件和使用powerpoint2003的powerpoint文件。 –

回答

1

我的猜测是,你在你的PHP代码输出空白字符。可能是换行。当通过PHP提供二进制文件时,这是造成文件损坏的一个常见原因,并且很难发现。在一些文件类型被损坏而另一些文件类型不被破坏的情况下也是非常典型的,因为一些文件类型可以应付额外的空白。

只需在<?php?>标记以外的源代码中提供换行符,就可以非常方便地将白色空间嵌入到PHP程序中。

检查您的PHP程序 - 以及您的所有包含 - 以确保在程序结束时关闭?>后没有任何尾随空行。还请在<?php标记之前检查文件的顶部,但程序结尾的空白行更常见。

事实上,最好完全删除?>结束标记 - 无论如何它是可选的,并且删除它意味着您绝对不会在PHP文件末尾有任何空白问题。

希望有所帮助。

+0

经过测试。删除?>凯清除空白,但仍然是同样的问题。 –

+0

您是否对原始文件与下载的副本进行了字节比较?这可能会给你一个线索,知道它是什么。 – Spudley

+0

下载的文档文件有66.051字节和原始的66.045字节 –