如何使用PHP下载zip而不需要凌乱的代码

时间:2017-12-13 08:18:23

标签: php linux

我想在我的linux服务器上下载xxx.zip。

我从php官方网站获得了代码。网址是

http://php.net/manual/en/function.readfile.php

我设置了内容类型:application / zip。但不幸的是,在执行download.php时,我在firfox或chrome浏览器中遇到了混乱的代码。

我的linux charset和浏览器字符集都是utf-8。

这是我的download.php代码:

<?php  
 $file_name = "xxx.zip";        
if (!file_exists ($file_name)){    
   echo "file is not exist";    
   exit();    
} 
else{    
header('Content-Description: File Transfer');
header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename="'.basename($file_name).'"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file_name));    

readfile ($file_name);    
exit;    
} 
?>

压缩xxx.zip代码是:

<?php
$fileArr={1.jpg,2.jpg,3.jpg};

$fpName="xxx.zip";

$zip=new ZipArchive();
$zip->open($fpName,ZipArchive::CREATE);
foreach($fileArr as $file)
{
  $zip->addFile("files/".$file,basename($file));
  //$zip->renameName($file,$fileChName);
}
$zip->close();
?>

但是,我可以从linux服务器下载xftp的xxx.zip文件,并在我的windows桌面上成功解压缩xxx.zip。

2 个答案:

答案 0 :(得分:0)

$file_name = "xxx.zip"; 
header("Cache-Control: no-cache, must-revalidate");
header("Expires: 0");
header("Content-Disposition: attachment; filename=\"" .basename($file_name)."\"");
header("Content-Length: " . filesize($file_name));
header("Content-Type: application/zip;");
readfile($file_name);
exit;

这样可行。

答案 1 :(得分:0)

我多次使用下载文件的功能可能有用

function sendfile( $filename=null, $filepath=null ){
    if( file_exists( $filepath ) ){

        if( !is_file( $filepath ) or connection_status()!=0 ) return false;

        header("cache-control: no-store, no-cache, must-revalidate");
        header("pragma: no-cache");
        header("expires: ".gmdate("d, d m y h:i:s", mktime( date("h")+2, date("i"), date("s"), date("m"), date("d"), date("y")))." gmt");
        header("content-type: application/octet-stream");
        header("content-length: ".(string)( filesize( $filepath ) ) );
        header("content-disposition: inline; filename={$filename}");
        header("content-transfer-encoding: binary\n");

        if( $file = @fopen( $filepath, 'rb' ) ) {
            while( !@feof( $file ) and ( connection_status()==0 ) ) {
                print( fread( $file, 1024*8 ) );
                flush();
            }
            @fclose( $file );
        }
        return( ( connection_status()==0 ) and !connection_aborted() );
    }
}

$file_name = "xxx.zip";

if( file_exists( $file_name ) ) sendfile( 'somefile.zip', $file_name );