Php header to upload multiple files to loop

I create pdf files on the fly and I want to upload multiple files using php. Can i write a headline like this

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

in a while loop?

+4
source share
5 answers

The short answer is no, you need to tell the client something where the content ends and a new heading begins. You can use the zip utility and pack them for download, or you can look in the mime email format (which uses delimiters throughout the document), but I'm not sure that it will work over HTTP without explicitly invoking its email package.

I would just recommend using the zip utility. Create the desired PDF files, then pack them and send.

+5
source

No. HTTP does not support multiple files in a single download. There was some talk about adding the MIME style semantics in HTTP messages back when you could embed multiple responses in a single hyphen, but that was nowhere.

Unless you do something like encrypt multiple files on a server and transfer this zip code, there is no way to upload more than one file per request.

+3
source

Step 1. Create one index.php file and add the following code.

 <?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++; } } ?> 

Step 2. Create one download.php file and add the following code.

 <?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'); ?> 

Change the 'your_folder' folder name in both files.

+3
source

No. The standard only allows you to upload one file for each request. You could, if the ZIP method suggested above is not possible, use a javascript timeout page that redirects the user to each file one at a time. For instance:

 <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
source

Not only with PHP. But you should be able to achieve this with Javascript.

Make a loop from Javascript by creating new frames with PHP pages as the source.

Some browsers will warn their users about downloading multiple files, but they should work after they are accepted.

Hope this helps someone find the answer.

0
source

Source: https://habr.com/ru/post/1339668/


All Articles