12

对不起,如果标题没有解释太多。让我尝试进一步解释。

我的代码如下所示:

<?
//Grab the number in count.txt
$count = intval(file_get_contents('count.txt'));
//Move the number up one
file_put_contents('count.txt', ++$count);
$number = file_get_contents('count.txt');
//Force Download
header('Content-Disposition: attachment; filename=DataFiles'.$number.".csv");
header('Content-Type: application/octet-stream');

//The data

foreach($array as $info){
echo $info."\n";
}
?>

$array 是一个数据数组。

现在有时数据量可能超过5000,所以如果数据超过5000,则为每5000个正在回显的数据创建一个文件。Ea:如果$array中有20000条数据,那么一共会做成4个文件。

4

4 回答 4

16

您不能发送超过 1 个文件来响应 HTTP 请求。

我建议将文件压缩到一个文件中并返回。

请参阅:使用 php 将多个文件下载为 zip 文件

于 2013-05-06T00:51:43.713 回答
16

在这里,您将了解如何下载多个文件...技巧是在同一页面中呈现许多 iframe。每个帧都有不同的来源,强制下载不同的文件

<?php
for($i = 0; $i<5; $i++){
    echo '<iframe src="test_multiple_downfile.php?text='.$i.'">/iframe>';
}
?>

test_multiple_downfile.php 内容是这样的:

$out = $_GET['text'];
header("Content-Type: plain/text");
header("Content-Disposition: Attachment; filename=testfile_".$out.".txt");
header("Pragma: no-cache");
echo "$out";
于 2017-08-29T11:26:11.823 回答
4

我使用 AJAX 和 jQuery 来做到这一点,一种方法是准备所有文件并将它们放入每个文件都有唯一 ID 的会话中。ajax 调用的返回是对带有 ID 列表的 JavaScript 的调用。

JavaScript 必须创建尽可能多的隐藏 IFrame,并且您有 ID,并且在每个 ID 中,调用 PHP 来下载部件。那是您放置下载标题的地方。一旦你完成了字节的转储,你就可以从会话中删除它们。使用唯一 ID 并在下载后删除它们可确保没有人下载两次相同的文件。

ti 的好处在于,如果您刷新页面,由于 IFrame 是动态的,它们不会尝试再次下载。如果出现错误,用户将看不到它们,因为它们是隐藏的 IFrame。

因此,如果下载出现问题,您可以发送 JavaScript 警报或调用 top.FunctionName('message'); 而不是发送标头进行下载。向用户发送某种警报。

我最多可以同时下载 10 次。但用户也会被提示 10 次。如果您不想压缩它们,这是您必须考虑的事情。

于 2015-06-05T15:12:47.917 回答
3

不,这是不可能的,因为 HTTP 协议被设计为每次请求发送一个文件

于 2013-05-06T00:47:34.600 回答