заголовок php для загрузки нескольких файлов в цикл

Я создаю pdf-файлы на лету, и я хочу загрузить несколько файлов с помощью php. Могу ли я писать заголовок, как это

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

в цикле while?

Solutions Collecting From Web of "заголовок php для загрузки нескольких файлов в цикл"

Короткий ответ – нет, вам нужно что-то сообщить клиенту, где заканчивается контент, и начинается новый заголовок. Вы можете использовать утилиту zip и упаковать их для загрузки, или вы можете посмотреть в формате электронной почты mime (который использует разделители по всему документу), но я не уверен, что будет работать по протоколу HTTP без явного вызова его пакет электронной почты.

Я бы просто рекомендовал использовать утилиту zip. Создайте нужные PDF-файлы, затем упакуйте их и отправьте.

Нет. HTTP не поддерживает несколько файлов в одной загрузке. Были некоторые разговоры о добавлении семантики стиля MIME к сообщениям HTTP назад, когда вы могли встроить несколько ответов в одну передачу, но это никуда не денется.

Если вы не сделаете что-то вроде того, как зашифровать несколько файлов на сервере и перенести этот почтовый индекс, невозможно загрузить более одного файла за запрос.

Шаг 1: Создайте один файл 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'); ?> 

Измените «your_folder» на имя папки в обоих файлах.

Нет. Стандарт позволяет только один файл загружаться по запросу. Вы могли бы, если предложенный выше метод 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> 

Не только с PHP. Но вы должны быть в состоянии достичь этого с помощью Javascript.

Сделайте цикл из Javascript, создав новые фреймы с PHP-страницами в качестве источника.

Однако некоторые браузеры предупреждают своих пользователей о загрузке нескольких файлов, но они должны работать после их принятия.

Надеюсь, это поможет кому-то найти ответ.