servidor - Cómo forzar la descarga de archivos con PHP
php descargar archivo automaticamente (9)
Deseo solicitar que se descargue un archivo cuando el usuario visite una página web con PHP. Creo que tiene algo que ver con file_get_contents
, pero no estoy seguro de cómo ejecutarlo.
$url = "http://example.com/go.exe";
Después de descargar un archivo con header(location)
no está redirigiendo a otra página. Simplemente se detiene.
El siguiente código es una forma correcta de implementar un servicio de descarga en php como se explica en el siguiente tutorial
header(''Content-Type: application/zip'');
header("Content-Disposition: attachment; filename=/"$file_name/"");
set_time_limit(0);
$file = @fopen($filePath, "rb");
while(!feof($file)) {
print(@fread($file, 1024*8));
ob_flush();
flush();
}
En caso de que tenga que descargar un archivo con un tamaño mayor que el límite de memoria permitido ( memory_limit
ini setting), que causaría el PHP Fatal error: Allowed memory size of 5242880 bytes exhausted
error PHP Fatal error: Allowed memory size of 5242880 bytes exhausted
, puede hacer esto:
// File to download.
$file = ''/path/to/file'';
// Maximum size of chunks (in bytes).
$maxRead = 1 * 1024 * 1024; // 1MB
// Give a nice name to your download.
$fileName = ''download_file.txt'';
// Open a file in read mode.
$fh = fopen($file, ''r'');
// These headers will force download on browser,
// and set the custom file name for the download, respectively.
header(''Content-Type: application/octet-stream'');
header(''Content-Disposition: attachment; filename="'' . $fileName . ''"'');
// Run this until we have read the whole file.
// feof (eof means "end of file") returns `true` when the handler
// has reached the end of file.
while (!feof($fh)) {
// Read and output the next chunk.
echo fread($fh, $maxRead);
// Flush the output buffer to free memory.
ob_flush();
}
// Exit to make sure not to output anything else.
exit;
Lea los documentos sobre el readfile función PHP
$file_url = ''http://www.myremoteserver.com/file.exe'';
header(''Content-Type: application/octet-stream'');
header("Content-Transfer-Encoding: Binary");
header("Content-disposition: attachment; filename=/"" . basename($file_url) . "/"");
readfile($file_url); // do the double-download-dance (dirty but worky)
También asegúrese de agregar el tipo de contenido adecuado en función de su aplicación de archivo / archivo zip, aplicación / pdf, etc., pero solo si no desea activar el cuadro de diálogo Guardar como.
Primero, muestre su archivo y configure su valor en url.
index.php
<a href="download.php?download=''.$row[''file''].''" title="Download File">
descargar.php
<?php
/*db connectors*/
include(''dbconfig.php'');
/*function to set your files*/
function output_file($file, $name, $mime_type='''')
{
if(!is_readable($file)) die(''File not found or inaccessible!'');
$size = filesize($file);
$name = rawurldecode($name);
$known_mime_types=array(
"htm" => "text/html",
"exe" => "application/octet-stream",
"zip" => "application/zip",
"doc" => "application/msword",
"jpg" => "image/jpg",
"php" => "text/plain",
"xls" => "application/vnd.ms-excel",
"ppt" => "application/vnd.ms-powerpoint",
"gif" => "image/gif",
"pdf" => "application/pdf",
"txt" => "text/plain",
"html"=> "text/html",
"png" => "image/png",
"jpeg"=> "image/jpg"
);
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";
};
};
@ob_end_clean();
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'');
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);
}
$chunksize = 1*(1024*1024);
$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);
echo($buffer);
flush();
$bytes_send += strlen($buffer);
}
fclose($file);
} else
die(''Error - can not open file.'');
die();
}
set_time_limit(0);
/*set your folder*/
$file_path=''uploads/''."your file";
/*output must be folder/yourfile*/
output_file($file_path, ''''."your file".'''', $row[''type'']);
/*back to index.php while downloading*/
header(''Location:index.php'');
?>
Una modificación de la respuesta aceptada anteriormente, que también detecta el tipo MIME en tiempo de ejecución:
$finfo = finfo_open(FILEINFO_MIME_TYPE);
header(''Content-Type: ''.finfo_file($finfo, $path));
$finfo = finfo_open(FILEINFO_MIME_ENCODING);
header(''Content-Transfer-Encoding: ''.finfo_file($finfo, $path));
header(''Content-disposition: attachment; filename="''.basename($path).''"'');
readfile($path); // do the double-download-dance (dirty but worky)
prueba esto:
header(''Content-type: audio/mp3'');
header(''Content-disposition: attachment;
filename=“''.$trackname''”'');
readfile(''folder name /''.$trackname);
exit();
Eso es todo lo que necesitas. "Monkey.gif" cambia a su nombre de archivo. Si necesita descargar desde otro servidor, "monkey.gif" cambia a " http://www.exsample.com/go.exe "
<?php
$file = "http://example.com/go.exe";
header("Content-Description: File Transfer");
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=''" . basename($file) . "''");
readfile ($file);
exit();
?>
O bien, cuando el archivo no se puede abrir con el navegador, puede usar el encabezado de la Location
:
<?php header("Location: http://example.com/go.exe"); ?>
header("Content-Type: application/octet-stream");
header("Content-Transfer-Encoding: Binary");
header("Content-disposition: attachment; filename=/"file.exe/"");
echo readfile($url);
es correcto
o mejor para el tipo de archivo exe
header("Location: $url");