.zip 文件下载为 .php

Posted

技术标签:

【中文标题】.zip 文件下载为 .php【英文标题】:.zip file downloading as .php 【发布时间】:2013-04-09 05:07:57 【问题描述】:

我有一个使用 php 在服务器上生成的 .zip 文件。生成的文件是有效的,我通过 ftp 等下载了它。

我需要创建一种方法,让用户在生成此文件后下载该文件,然后删除该文件。这是我要发送的标头。

header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-control: public");
header("Content-Description: File Transfer");
header('Content-type: application/zip'); 
header("Content-Transfer-Encoding: Binary");
header('Content-Disposition: attachment; filename="'.basename($archive_file_name).'"');
header("Content-Length: " . filesize($this->dirPath."/".$archive_file_name) );
ob_clean();
//echo is_file($this->dirPath."/".$archive_file_name);
readfile($this->dirPath."/".$archive_file_name);
unlink($this->dirPath."/".$archive_file_name);
exit;

上面的代码在我尝试下载前几次时有效,但经过几圈后它开始下载为 .php 文件而不是 .zip

通过转到开始创建 zip 文件的特定链接来触发文件下载。完成后,它会发出标头以开始下载

【问题讨论】:

试试这个***.com/questions/10681844/php-zip-file-download “当我尝试下载前几次时,上面的代码有效”多少次?我下载了超过 15 次并且它的工作..你多少钱?? 如果用户连接断开 php 继续直到完成工作,因为您的文件将被删除或在一个请求后不下载您可以使用connection_status()==0 检查连接,如下所示,请参阅答案以获取更多信息 另见:***.com/questions/10596116/… 【参考方案1】:

您的代码看起来正确。但是,您需要确保代码的前后空格。 在代码中添加标头时,空间会中断并且不会加载 zip 文件。 再次检查并删除页面顶部和底部的空格。

还有一行写着 readfile($this->dirPath."/".$archive_file_name); 可以从代码中删除

【讨论】:

是的.. 空间是罪魁祸首.. 使用多个文本编辑器来编辑我的文件.. 我认为在某个地方附加了一个额外的空间。在这上面浪费了很多时间!【参考方案2】:

试试这个标题,你可以下载简历 我建议使用数据库或日志文件来了解是否下载了文件,因为此标头可用下载器下载部分

从下载器获取请求范围,您可以使用 fseek 读取文件范围

$Range=@$_SERVER['HTTP_RANGE'];//Range: bytes=843530240-
$Cach="";
if($Range!="")
  $Range=explode("=",$Range);
  $Cach=(int)trim($Range[1]," -");      

缓存控制器

function caching_include($file) 
     $headers = $_SERVER;
     // Get the modification timestamp
     if(!(list(,,,,,,,,,$lastModified) = @stat($file)))
           echo Error;
           exit();          
     
     // Build our entity tag
     $eTag = "ci-".dechex(crc32($file.$lastModified));
     if (false and (strpos(@$headers['If-None-Match'], "$eTag")) &&(gmstrftime("%a, %d %b %Y %T %Z", $lastModified) == @$headers['If-Modified-Since'])) 
        // They already have an up to date copy so tell them
        header('HTTP/1.1 304 Not Modified');
        header('Cache-Control: private');
        header("Pragma: ");
        header('Expires: ');
        header('Content-Type: ');
        header('ETag: "'.$eTag.'"');
        exit;
      else 
       // We have to send them the whole page
        header('Cache-Control: private');
        header('Pragma: ');
        header('Expires: ');
        header('Last-Modified: '.gmstrftime("%a, %d %b %Y %T %Z",$lastModified));
        header('ETag: "'.$eTag.'"');
     
  

下载标题

header("Server: SepidarSoft/ir-system");//server name 
header("Date: ".date("a,d b Y H:M:S GMT",time()));
header("X-Powered-By: SepidarSoft");
header("Cache-Control: public");
header("Content-disposition:filename=\"".$BaseName."\"");//file name
caching_include($FPatch);//caching controller 
header("Accept-Ranges:bytes");
header("Content-Transfer-Encoding: binary\n"); 
header("Connection: Keep-Alive");
header("Content-Type: $Type");//file type like application/zip
header("Content-Length: ".($FSize-$Cach)); //length of download it is for resume  
header("Content-Range: bytes ".$Cach."-".($FSize-1)."/".$FSize); //download range it is for resume
header("HTTP/1.1 206 Partial Content",true);
set_time_limit(0);

如果在代码中使用set_time_limit(0);,如果用户连接断开,php 继续直到完成工作,因为您的文件将被删除,或者在一个请求后您可以使用connection_status()==0 检查连接,如下所示

$Speed=102400;
fseek($Handle,$From);//if use resume it is useful 
while(!@feof($Handle) and (connection_status()==0))
    print(fread($Handle,$Speed));
    flush(); 
            ob_flush(); 
  
 if(connection_status()==0)//with this condition you can understand download is down by user 
       unlink($this->dirPath."/".$archive_file_name);
    

【讨论】:

以上是关于.zip 文件下载为 .php的主要内容,如果未能解决你的问题,请参考以下文章

php打包文件为ZIP包后下载到本地

如何在php中将文件转换为zip

将所有文件压缩为 zip 的 PHP 代码无法正常工作

PHP on the fly ZIP 下载为空白

php zip提取使文件为空

PHP:使用 ZipArchive 创建 zip 文件时出现错误 (500)