2011-02-14 93 views
4

我正在创建pdf文件,我想用php下载多个文件。我可以写这样的标题吗?php header在循环中下载多个文件

<?php 
header('Content-type: application/pdf'); 
header('Content-Disposition: attachment; filename="downloaded.pdf"'); 
readfile('original.pdf'); 
?> 

in while loop?

+0

以防万一有人仍在寻找解决这个问题..我在这里找到它..blog.drinkncode.com /下载多个文件通过循环在PHP – 2016-02-11 19:49:32

回答

5

简短的答案是否定的,你需要一些东西来告诉客户端内容结束和新的标题开始。你可以或者使用zip实用程序并将它们打包下载,或者你可以看一下也许是一个MIME电子邮件格式(它在整个文档中使用分隔符),但我不确定没有明确地通过HTTP协议称它为“电子邮件”包。

我只是推荐使用zip实用程序。生成你需要的PDF,然后打包并发送出去。

3

不可以。HTTP不支持单个下载中的多个文件。有一些关于在HTTP消息中添加MIME风格语义的讨论,因此您可以在一次传输中嵌入多个响应,但这并没有到任何地方。

除非你做了类似于压缩服务器上的多个文件并传输该zip的内容,否则无法为每个请求下载多个文件。

0

不可以。该标准仅允许为每个请求下载单个文件。如果上面提出的ZIP方法不可行,那么您可以使用带有JavaScript超时的基页来将用户重定向到每个文件,一次一个。例如:

<script type="text/javascript"> 
var file_list = new Array(
    'http://www.mydomain.com/filename1.file', 
    'http://www.mydomain.com/filename2.file', 
    'http://www.mydomain.com/filename3.file' 
); 
for (var i=0; i < file_list.length - 1; i++) { 
    setTimeout(function() { 
    document.location = file_list[i]; 
    }, i * 1000); 
} 
</script> 

<h1>Please wait</h1> 
<p>Your download will start in a moment.</p> 
+0

这是100%不可能的。更改文档位置时。 Java脚本自动停止... – 2014-02-28 06:47:23

3

第一步:创建一个index.php文件,并添加以下代码。

<?php 
$path = $_SERVER['DOCUMENT_ROOT']."/your_folder/"; 

$files = scandir($path); 
$count=1; 
foreach ($files as $filename) 
{ 
    if($filename=="." || $filename==".." || $filename=="download.php" || $filename=="index.php") 
    { 
     //this will not display specified files 
    } 
    else 
    { 
     echo "<label >".$count.".&nbsp;</label>"; 
     echo "<a href="download.php/?filename=".$filename."">".$filename."</a> 
"; 
     $count++; 
    } 
} 
?> 

第2步:创建一个download.php文件并添加以下代码。

<?php 
function output_file($file, $name, $mime_type='') 
{ 
/* 
This function takes a path to a file to output ($file), the filename that the browser will see ($name) and the MIME type of the file ($mime_type, optional). 
*/ 

//Check the file premission 
if(!is_readable($file)) die('File not found or inaccessible!'); 

$size = filesize($file); 
$name = rawurldecode($name); 

/* Figure out the MIME type | Check in array */ 
$known_mime_types=array(
    "pdf" => "application/pdf", 
    "txt" => "text/plain", 
    "html" => "text/html", 
    "htm" => "text/html", 
"exe" => "application/octet-stream", 
"zip" => "application/zip", 
"doc" => "application/msword", 
"xls" => "application/vnd.ms-excel", 
"ppt" => "application/vnd.ms-powerpoint", 
"gif" => "image/gif", 
"png" => "image/png", 
"jpeg"=> "image/jpg", 
"jpg" => "image/jpg", 
"php" => "text/plain" 
); 

if($mime_type==''){ 
    $file_extension = strtolower(substr(strrchr($file,"."),1)); 
    if(array_key_exists($file_extension, $known_mime_types)){ 
    $mime_type=$known_mime_types[$file_extension]; 
    } else { 
    $mime_type="application/force-download"; 
    }; 
}; 

//turn off output buffering to decrease cpu usage 
@ob_end_clean(); 

// required for IE, otherwise Content-Disposition may be ignored 
if(ini_get('zlib.output_compression')) 
    ini_set('zlib.output_compression', 'Off'); 

header('Content-Type: ' . $mime_type); 
header('Content-Disposition: attachment; filename="'.$name.'"'); 
header("Content-Transfer-Encoding: binary"); 
header('Accept-Ranges: bytes'); 

/* The three lines below basically make the 
    download non-cacheable */ 
header("Cache-control: private"); 
header('Pragma: private'); 
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); 

// multipart-download and download resuming support 
if(isset($_SERVER['HTTP_RANGE'])) 
{ 
list($a, $range) = explode("=",$_SERVER['HTTP_RANGE'],2); 
list($range) = explode(",",$range,2); 
list($range, $range_end) = explode("-", $range); 
$range=intval($range); 
if(!$range_end) { 
    $range_end=$size-1; 
} else { 
    $range_end=intval($range_end); 
} 

$new_length = $range_end-$range+1; 
header("HTTP/1.1 206 Partial Content"); 
header("Content-Length: $new_length"); 
header("Content-Range: bytes $range-$range_end/$size"); 
} else { 
$new_length=$size; 
header("Content-Length: ".$size); 
} 

/* Will output the file itself */ 
$chunksize = 1*(1024*1024); //you may want to change this 
$bytes_send = 0; 
if ($file = fopen($file, 'r')) 
{ 
if(isset($_SERVER['HTTP_RANGE'])) 
fseek($file, $range); 

while(!feof($file) && 
    (!connection_aborted()) && 
    ($bytes_send<$new_length) 
     ) 
{ 
    $buffer = fread($file, $chunksize); 
    print($buffer); //echo($buffer); // can also possible 
    flush(); 
    $bytes_send += strlen($buffer); 
} 
fclose($file); 
} else 
//If no permissiion 
die('Error - can not open file.'); 
//die 
die(); 
} 
//Set the time out 
set_time_limit(0); 

//path to the file 
$file_path=$_SERVER['DOCUMENT_ROOT'].'/your_folder/'.$_REQUEST['filename']; 


//Call the download function with file path,file name and file type 
output_file($file_path, ''.$_REQUEST['filename'].'', 'text/plain'); 

?> 

更改“您的文件夹”与你在这两个文件夹的名称。

0

不适用于PHP。但你应该能够用一些Javascript来实现这一点。

从Javascript中创建循环,以PHP页面为源创建新框架。

虽然有些浏览器会警告他们的用户有多个文件下载,但一旦他们接受它应该可以工作。

希望这可以帮助别人寻找答案。