Comparta una función de archivo de encabezado php súper simple.
El código es el siguiente:
& lt? Lenguaje de programación del lado del servidor (abreviatura de Preprocesador de Hipertexto Profesional)
/**
*
Enviar archivos
*
*
@Autor:
leyenda(legendsky@hotmail.com)
*
@Enlace: p >
/?p=109
*
@Descripción:
Envío
Archivo
Para
Cliente
*
@Versión:
1.0
*
*
@param
Línea
$filename
Nombre o ruta del archivo
*
@param
Línea
$fancyName
Nombre de archivo definido por el usuario; si está vacío, se utiliza el nombre del archivo.
*
@param
Booleano
$forceDownload
¿Forzar descarga?
*
@param
Entero
$Límite de velocidad
Límite de velocidad, en bytes, 0 significa sin límite y no es compatible con Windows Server.
*
@param
Línea
$ $Content-Type
Tipo de archivo, el valor predeterminado es aplicación /flujo de octetos.
*
*
@return
Booleano
*/
Función
Enviar archivo ($ nombre de archivo,
$fancyName
=
'',
$ forceDownload
=
Sí,
$límite de velocidad
=
0,
$contentType
=
'')
{
Si
(! es posible Leer( $fileName))
{
header("HTTP/1.1
404
No
Encontrado" );
Devolver
Falso;
}
$fileStat
= p>
stat($ fileName);
$ lastModified
=
$ fileStat[' mtime '];
$md5 p>
=
md5($fileStat['mtime']
.'='.
$fileStat['ino '] p>
.'='.
$ fileStat[' tamaño ']);
$etag
=
'"'
.
$md5
.
'-'
.
crc32($MD5)
'"';
Título ('Última hora de modificación:
'
.
gmdate("D,
d
M
Y
p>H:i:s",
$lastModified)
.
'
GMT');
Título(" ETag:
$ etag ");
if
(isset($ _ SERVER[' HTTP _ IF _ MODIFIED _ SINCE '])
& amp& amp
strtotime($ _ SERVER[' HTTP _ IF _ MODIFICADO _ DESDE '])
& gt=
$lastModified)
{
header("HTTP/ 1.1
304
No
modificar”);
Devolver
Verdadero;
}
Si
(isset($ _ SERVER[' HTTP _ IF _ UNMODIFIED _ SINCE '])
& amp& amp
strtotime($ _ SERVER[' HTTP _ IF _ UNMODIFIED _ SINCE '])
& lt
$lastModified)
{ p >
encabezado("HTTP/1.1
304
No
modificado");
Regresar
Verdadero;
}
Si
(isset($ _ SERVER[' HTTP _ IF _ NONE _ MATCH '])
& amp& amp
$_SERVER['HTTP_IF_NONE_MATCH']
==
$etag)
{
encabezado("HTTP/1.1
304
No
Modificado");
Regresar
Verdadero;
}
Si
($fancyName
==
'')< / p>
{
$fancyName
=
nombrebase($nombredearchivo);
}
Si
($contentType
==
'')
{
$contentType
=
"Aplicación/OctetStream";
}
$fileSize
=
$ fileStat[' tamaño '];
$contentLength
=
$ fileSize
$isPartial
=
Falso;
si
(isset($_SERVER['HTTP_RANGE']))
{
Si
(preg_match('/^bytes=(d*)-(d*)$/',
$_SERVER[' HTTP_RANGE'], p>
$coincidencias))
{
$startPos
=
$ coincidencias[ 1];
$endPos
=
$ coincidencias[2];
Si
($ startPos
==
''
& amp& amp
$endPos
==
'')
{
retorno
falso;
} p>
Si
($startPos
==
'')
{
$startPos
=
$fileSize
-
$ endPos
$endPos
=
$fileSize
-
1;
}
Otro
Si
($endPos
==
'')
{
$endPos
=
$tamañoarchivo
-
1;
}
$ posiciónInicio
=
$PosInicio
& lt
:
$PosInicio
$endPos
=
$endPos
& gt
$fileSize
-
1
$fileSize
-
1
:
$ endPos
$longitud
=
$endPos
-
$startPos
+
1;
si
($longitud
& lt
0)
{
Devolver
Falso;
}
$contentLength
=
$length ;
$isPartial
=
Verdadero;
}
}
//
Enviar
Encabezado
Si
($isPartial)
{ p>
Título('HTTP/1.1
206
Parte
Contenido');
Título("Contenido -Rango:
bytes
$ pos inicial-$ pos final/$ tamaño archivo ");
}
Otros
p>{
encabezado("HTTP/1.1
200
OK");
$startPos
=
0;
$endPos
=
$contentLength
- p>
1;
}
Título('Pragma:
Caché');
Título('Control de caché: p>
Público,
Debe revalidarse,
max-age = 0');
Título('accept-range:
Bytes');
Título('Tipo de contenido:
.
$ tipo de contenido);
Título('Longitud del contenido:
.
$ contenido longitud);
if
($forceDownload)
{
título('disposición-contenido:
Adjunto;
Nombre de archivo = " '
.
rawurlencode($fancyName).
'"');//Los caracteres chinos se convierten automáticamente en códigos URL.
Title('Content-Disposition:
Adjunto;
Nombre de archivo = " '
.
$fancyName.
'"');
}
Título("Codificación-transmisión-contenido:
Binario");
$bufferSize
=
2048;
Si
($Límite de velocidad
! =
0)
{
$packetTime
=
Piso (tamaño del búfer p>
*
1000000
/
$ límite de velocidad);
}
$ bytesEnviados
=
0;
$fp
=
fopen($nombre de archivo,
"Rb");
fseek($FP,
$ startPos);
//fpassthru($ FP);
Durante...
($bytesSent
& lt
$contentLength
& amp& amp
!feof(FP)
& amp& amp
Estado de conexión()
==
)
{
Si
($límite de velocidad
!=
0)
{
Lista($usec,
$sec)
=
explotar("
", p>
microtime());
$outputTimeStart
=
((float)$usec
+ p>
(float)$ seg);
}
$readBufferSize
=
$contentLength
-
$bytesSent
& lt
$bufferSize
$contentLength
- p>
$bytesEnviado
:
$ bufferSize
$buffer
=
fread( $FP ,
$ readBufferSize);
Eco
$ buffer
ob _ flush();
flush ();
$bytesSent
+=
$ readBufferSize
if
($velocidad límite
! =
0)
{
Lista($usec,
$sec)
= p>
Explotar("
",
microtime());
$outputTimeEnd
=
((flotación)$usec
+
(flotación)$ seg);
$tiempo de uso
=
((Float)
$outputTimeEnd
-
(Float)
$outputTimeStart)
*
1000000;
Tiempo de suspensión
=
Ronda(paqueteTiempo
-
$ tiempo de uso);
Si
($tiempo de sueño
tiempo
& gt
0)
{
us LEEP($ tiempo de sueño);
}
}
}
Devolver
Verdadero;
}
? >