Red de conocimientos turísticos - Información de alquiler - Comparta una función de archivo de encabezado php súper simple.

Comparta una función de archivo de encabezado php súper simple.

Copia el código

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

=

stat($ fileName);

$ lastModified

=

$ fileStat[' mtime '];

$md5

=

md5($fileStat['mtime']

.'='.

$fileStat['ino ']

.'='.

$ 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)

{

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'],

$coincidencias))

{

$startPos

=

$ coincidencias[ 1];

$endPos

=

$ coincidencias[2];

Si

($ startPos

==

''

& amp& amp

$endPos

==

'')

{

retorno

falso;

}

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)

{

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

-

1;

}

Título('Pragma:

Caché');

Título('Control de caché:

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

*

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("

",

microtime());

$outputTimeStart

=

((float)$usec

+

(float)$ seg);

}

$readBufferSize

=

$contentLength

-

$bytesSent

& lt

$bufferSize

$contentLength

-

$bytesEnviado

$ bufferSize

$buffer

=

fread( $FP ,

$ readBufferSize);

Eco

$ buffer

ob _ flush();

flush ();

$bytesSent

+=

$ readBufferSize

if

($velocidad límite

! =

0)

{

Lista($usec,

$sec)

=

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;

}

? >