Pregunta sobre php – Obteniendo mime tipo de archivos comprimidos

3

Obtener el tipo mime de un archivo cargado es bastante fácil:

<code>echo mime_content_type($fileatt['tmp_name']);
</code>

Sin embargo, también quiero comprobar los archivos de tipo mime que se incluyen en un archivo comprimido. Después de descomprimir mis archivos (repasando los archivos en el archivo zip y dondei es el archivo actual), lo he intentado:

<code>$info = pathinfo($zip->getNameIndex($i));
echo mime_content_type($info['dirname'] . "\\" . $info['basename']);
</code>

que da el error: Advertencia: mime_content_type () [function.mime-content-type]: el archivo o la ruta no se encontraron '. \ foo.pdf' enC:\Users\<user>\<website>\validation.php en linea 56

Me di cuenta de que eldirname para un archivo comprimido es relativo al archivo zip, no a la ruta absoluta, así que intenté:

<code>$a = pathinfo($fileatt['tmp_name']);
$b = $a['dirname'] . "\\" . $info['basename'];
echo mime_content_type($b);
</code>

que da el error: Advertencia: mime_content_type () [function.mime-content-type]: el archivo o la ruta no se encontraron 'C: \ xampp \ tmp \ foo.pdf' enC:\Users\<user>\<website>\validation.php en linea 56

¿Alguien puede arrojar alguna luz sobre la ruta del archivo? (Sospecho que la respuesta podría ser la misma que el comentario enobteniendo altura y ancho de la imagen de archivos comprimidos, pero hay métodos alternativos?)

ACTUALIZAR

Gracias a Baba, lo siguiente funciona:

<code>$fp = fopen('zip://C:\Users\<user>\<website>\test.zip#foo.jpg', "r");
</code>

(n.b. Solo puedo hacer que esto funcione cuando proporciono la ruta completa del archivo zip, no un archivo tmp como sería el caso cuando un archivo se carga a través de un formulario). Sin embargo, tratando de obtener el tipo mime:echo mime_content_type($fp); genera el error:

<code>Warning: mime_content_type() [function.mime-content-type]: stream does not support seeking in C:\Users\<user>\<website>\includes\validation.php on line 70
</code>

Esto sucede independientemente del tipo de archivo (es decir, el problema indicado en el único comentario enhttp://php.net/manual/en/ziparchive.getstream.php no parece afectarme).

Por cierto, este es también el mismo error que obtengo cuando intento un método diferente:$fp = $zip->getStream('foo.jpg');

Sé que hay varias otras preguntas de 'transmisión no compatible' en SO, pero no pude averiguar cómo se relacionaban con mi problema, y ​​esperaba que dado que este método ha sido específicamente sugerido, alguien podría tener una buena respuesta. .

(p.s. no estoy usando elfinfo_* funciona como mi host actualmente se niega a instalar PHP v5.3).

¿Lo has probado con elZip extension's stream wrapper ? Baba
Solo puedes usarmime_content_type() en archivos físicos, lo que significa que tendrá que extraer los archivos de su archivo zip a un directorio en algún lugar y luego recorrerlos, no solo recorrer la lista de archivos del archivo zip. Nadh

Tu respuesta

2   la respuesta
2

A. Puedes empezar intentando

<code> mime_content_type('zip:///path/to/file.zip#'. $chapterZip->getNameIndex ( $i ));
</code>

B. Lo que solo puedo pensar ahora es un reemplazo paramime_content_type Puede que no sea el mejor enfoque, pero estoy seguro de que saldrá a la superficie hasta que encuentre una mejor solución

<code>$chapterZip = new ZipArchive ();
if ($chapterZip->open ( "stockoverflow.zip" )) {
    for($i = 0; $i < $chapterZip->numFiles; $i ++) {
        var_dump ( mime_content_type_replacement ( $chapterZip->getNameIndex ( $i ) ) );
    }
}
</code>

Función de reemplazo utilizandofile extension yfinfo_open ( FILEINFO_MIME )

<code>function mime_content_type_replacement($filename) {

    $mime_types = array (

            'txt' => 'text/plain',
            'htm' => 'text/html',
            'html' => 'text/html',
            'php' => 'text/html',
            'css' => 'text/css',
            'js' => 'application/javascript',
            'json' => 'application/json',
            'xml' => 'application/xml',
            'swf' => 'application/x-shockwave-flash',
            'flv' => 'video/x-flv',

            // images
            'png' => 'image/png',
            'jpe' => 'image/jpeg',
            'jpeg' => 'image/jpeg',
            'jpg' => 'image/jpeg',
            'gif' => 'image/gif',
            'bmp' => 'image/bmp',
            'ico' => 'image/vnd.microsoft.icon',
            'tiff' => 'image/tiff',
            'tif' => 'image/tiff',
            'svg' => 'image/svg+xml',
            'svgz' => 'image/svg+xml',

            // archives
            'zip' => 'application/zip',
            'rar' => 'application/x-rar-compressed',
            'exe' => 'application/x-msdownload',
            'msi' => 'application/x-msdownload',
            'cab' => 'application/vnd.ms-cab-compressed',

            // audio/video
            'mp3' => 'audio/mpeg',
            'qt' => 'video/quicktime',
            'mov' => 'video/quicktime',

            // adobe
            'pdf' => 'application/pdf',
            'psd' => 'image/vnd.adobe.photoshop',
            'ai' => 'application/postscript',
            'eps' => 'application/postscript',
            'ps' => 'application/postscript',

            // ms office
            'doc' => 'application/msword',
            'rtf' => 'application/rtf',
            'xls' => 'application/vnd.ms-excel',
            'ppt' => 'application/vnd.ms-powerpoint',

            // open office
            'odt' => 'application/vnd.oasis.opendocument.text',
            'ods' => 'application/vnd.oasis.opendocument.spreadsheet' 
    );

    $ext = pathinfo ( $filename, PATHINFO_EXTENSION );
    if (array_key_exists ( $ext, $mime_types )) {
        return $mime_types [$ext];
    } elseif (function_exists ( 'finfo_open' )) {
        $finfo = finfo_open ( FILEINFO_MIME );
        $mimetype = finfo_file ( $finfo, $filename );
        finfo_close ( $finfo );
        return $mimetype;
    } else {
        return 'application/octet-stream';
    }
}
</code>

Para más tipos de mimos.

Tipos de PHP / Mime - ¿Lista de tipos de mime públicamente disponibles?

http://snipplr.com/view/1937/

Editar 1

Acabo de probar lo siguiente y funciona.

<code>$fp = fopen('zip://C:\stockoverflow.zip#1.MOV.xml',"r");
</code>

Editar 2

A.mime_content_type($fp) no funcionaria porquemime_content_type solo acepta argumento de cadena verhttp://php.net/manual/en/function.mime-content-type.php

B. No estoy seguro de por qué sigues apegándote amime_content_type Porque también se ha depreciado.

Esta función ha quedado en desuso como la extensión PECL Fileinfo proporciona la misma funcionalidad (y más) de una manera mucho más limpia.

C. trabajando en$fileatt['tmp_name'] directamente no es ideal ... es un archivo temporal y no debe manipularse. Para que usted trabaje en ese archivo, debe copiarlo en el servidor donde su PHP tendría permiso completo para acceder a él.

RE.ZipArchive::getStream Sólo trabajaría en una copia local de lazip archivo no temporal de carga de archivos

Gracias por la sugerencia. No estoy seguro de lo que está mal: tengo$fp = fopen('zip:\\\\\\'.$a['dirname'].'\\test.zip#file.pdf', 'r'); (barras diagonales inversas debido a Windows, y todas deben ser eliminadas - ¿Supongo que esto es correcto?),$a es lo mismo que se define en mi pregunta; pero me sale el error:Warning: fopen(zip:\\\C:\xampp\tmp\test.zip#file.pdf) [function.fopen]: failed to open stream: Invalid argument in C:\Users\<user>\<website>\includes\validation.php on line 60 ChrisW
Se responde por mi respuesta Baba
$fp = fopen('zip://C:\stockoverflow.zip#1.MOV.xml',"r"); trabajos Baba
Gracias por sus comentarios útiles hasta ahora; Puse más información en mi pregunta: si tienes más sugerencias, estaré encantado de probarlas :) ChrisW
Creo que la respuesta general es que, de todos modos, no es posible hacer lo que quiero sin guardar el zip primero. Las extensiones PECL solo están incluidas en PHP 5.3+ (que mi host no instalará, aparentemente rompe muchas cosas ...). Si elfinfo_* Los métodos se deprecian, ¿qué debo usar en su lugar? ChrisW
2

Sé que mencionaste que no podías encontrar una respuesta para php <5.3, pero estaba un poco atascado en esto y simplemente lo descubrí, espero que sea de utilidad para los que están en la última versión. No pude verlo. escrito en cualquier otro lugar.

Sencillamente, puedes usarfinfo-> buffer en los datos binarios para extraer el tipo MIME, que está disponible sin extraer el contenido a un nuevo archivo.

<code>$zip = new ZipArchive;
$zip->open("dir/archive.zip");
$binary = $zip->getFromIndex($fileToUnzip);
$filename = $zip->getNameIndex($fileToUnzip);
$zip->close();

$finfo = new finfo(FILEINFO_MIME_TYPE);
$MIMETypeandCharset = $finfo->buffer($binary);

// discard charset info
$MIMETypeAndCharsetArray = explode(';', $MIMETypeAndCharset);
$MIMEtype = $MIMETypeAndCharsetArray[0];


// you can change the source of an iframe to this php file in order to view a preview
// If the browser can't handle the file, the user is presented with a download box

header('Content-Type:$MIMEtype');
header('Content-Disposition: inline; filename="July Report.pdf"')
echo $binary;
</code>

Preguntas relacionadas