2010-08-19 15 views
7

Tengo un paquete de comercio electrónico llamado Prestashop. Le permiten vender productos virtuales, artículos descargables, como software, libros electrónicos, etc.Obtención de tipo MIME en PHP sin EXTENSIÓN DE ARCHIVO

Tienen un problema en el software donde nombran el nombre físico del producto descargable como un hash de 40 caracteres con no hay extensión. Luego, cuando un cliente va a descargar el archivo, el sistema debe verificar el tipo MIME para que se pueda configurar en el encabezado antes de que el archivo se envíe al navegador del cliente.

Aquí radica el problema. Usan cuatro métodos para determinar el tipo MIME.

  1. finfo_open() función, esta extensión NO se instala en mi host por lo que falla.
  2. mime_content_type() función, esto toma el archivo sin extensión y devuelve un tipo MIME 'text/plain', sin importar el tipo MIME en realidad es. Esta función ha quedado obsoleta y mis pensamientos son que no deberían usarla en absoluto.
  3. exec('file -bi '.escapeshellarg($file)). esto también falla en mi anfitrión.
  4. una serie de extensiones para que coincida con el tipo MIME.

Estoy teniendo dificultades para resolver esto debido al hecho de que nombre el archivo, cuando lo agrega a la oficina remota sin extensión. Es difícil para mí ver que esto alguna vez funciona.

He intentado muchas otras soluciones, incluida la obtención del CURLINFO_CONTENT_TYPE de una llamada a CURL para descargar el archivo, que, por cierto, devuelve 'texto/normal' para el mismo archivo.

¿Alguna idea sobre cómo puedo solucionar este problema?

solución utilizada ...

if (empty($mime_type)) 
{ 
    $bName = basename($filename); 
    $bName = explode('.', $bName); 
    $bName = strtolower($bName[count($bName) - 1]); 

    $mimeTypes = array(
    'ez'  => 'application/andrew-inset', 
    'atom'  => 'application/atom+xml', 
    'jar'  => 'application/java-archive', 
    'hqx'  => 'application/mac-binhex40', 
    'cpt'  => 'application/mac-compactpro', 
    'mathml' => 'application/mathml+xml', 
    'doc'  => 'application/msword', 
    'dat'  => 'application/octet-stream', 
    'oda'  => 'application/oda', 
    'ogg'  => 'application/ogg', 
    'pdf'  => 'application/pdf', 
    'ai'  => 'application/postscript', 
    'eps'  => 'application/postscript', 
    'ps'  => 'application/postscript', 
    'rdf'  => 'application/rdf+xml', 
    'rss'  => 'application/rss+xml', 
    'smi'  => 'application/smil', 
    'smil'  => 'application/smil', 
    'gram'  => 'application/srgs', 
    'grxml'  => 'application/srgs+xml', 
    'kml'  => 'application/vnd.google-earth.kml+xml', 
    'kmz'  => 'application/vnd.google-earth.kmz', 
    'mif'  => 'application/vnd.mif', 
    'xul'  => 'application/vnd.mozilla.xul+xml', 
    'xls'  => 'application/vnd.ms-excel', 
    'xlb'  => 'application/vnd.ms-excel', 
    'xlt'  => 'application/vnd.ms-excel', 
    'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12', 
    'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12', 
    'xlsm'  => 'application/vnd.ms-excel.sheet.macroEnabled.12', 
    'xltm'  => 'application/vnd.ms-excel.template.macroEnabled.12', 
    'docm'  => 'application/vnd.ms-word.document.macroEnabled.12', 
    'dotm'  => 'application/vnd.ms-word.template.macroEnabled.12', 
    'ppam'  => 'application/vnd.ms-powerpoint.addin.macroEnabled.12', 
    'pptm'  => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12', 
    'ppsm'  => 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12', 
    'potm'  => 'application/vnd.ms-powerpoint.template.macroEnabled.12', 
    'ppt'  => 'application/vnd.ms-powerpoint', 
    'pps'  => 'application/vnd.ms-powerpoint', 
    'odc'  => 'application/vnd.oasis.opendocument.chart', 
    'odb'  => 'application/vnd.oasis.opendocument.database', 
    'odf'  => 'application/vnd.oasis.opendocument.formula', 
    'odg'  => 'application/vnd.oasis.opendocument.graphics', 
    'otg'  => 'application/vnd.oasis.opendocument.graphics-template', 
    'odi'  => 'application/vnd.oasis.opendocument.image', 
    'odp'  => 'application/vnd.oasis.opendocument.presentation', 
    'otp'  => 'application/vnd.oasis.opendocument.presentation-template', 
    'ods'  => 'application/vnd.oasis.opendocument.spreadsheet', 
    'ots'  => 'application/vnd.oasis.opendocument.spreadsheet-template', 
    'odt'  => 'application/vnd.oasis.opendocument.text', 
    'odm'  => 'application/vnd.oasis.opendocument.text-master', 
    'ott'  => 'application/vnd.oasis.opendocument.text-template', 
    'oth'  => 'application/vnd.oasis.opendocument.text-web', 
    'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template', 
    'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', 
    'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 
    'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 
    'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', 
    'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 
    'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', 
    'vsd'  => 'application/vnd.visio', 
    'wbxml'  => 'application/vnd.wap.wbxml', 
    'wmlc'  => 'application/vnd.wap.wmlc', 
    'wmlsc'  => 'application/vnd.wap.wmlscriptc', 
    'vxml'  => 'application/voicexml+xml', 
    'bcpio'  => 'application/x-bcpio', 
    'vcd'  => 'application/x-cdlink', 
    'pgn'  => 'application/x-chess-pgn', 
    'cpio'  => 'application/x-cpio', 
    'csh'  => 'application/x-csh', 
    'dcr'  => 'application/x-director', 
    'dir'  => 'application/x-director', 
    'dxr'  => 'application/x-director', 
    'dvi'  => 'application/x-dvi', 
    'spl'  => 'application/x-futuresplash', 
    'tgz'  => 'application/x-gtar', 
    'gtar'  => 'application/x-gtar', 
    'hdf'  => 'application/x-hdf', 
    'js'  => 'application/x-javascript', 
    'skp'  => 'application/x-koan', 
    'skd'  => 'application/x-koan', 
    'skt'  => 'application/x-koan', 
    'skm'  => 'application/x-koan', 
    'latex'  => 'application/x-latex', 
    'nc'  => 'application/x-netcdf', 
    'cdf'  => 'application/x-netcdf', 
    'sh'  => 'application/x-sh', 
    'shar'  => 'application/x-shar', 
    'swf'  => 'application/x-shockwave-flash', 
    'sit'  => 'application/x-stuffit', 
    'sv4cpio' => 'application/x-sv4cpio', 
    'sv4crc' => 'application/x-sv4crc', 
    'tar'  => 'application/x-tar', 
    'tcl'  => 'application/x-tcl', 
    'tex'  => 'application/x-tex', 
    'texinfo' => 'application/x-texinfo', 
    'texi'  => 'application/x-texinfo', 
    't'   => 'application/x-troff', 
    'tr'  => 'application/x-troff', 
    'roff'  => 'application/x-troff', 
    'man'  => 'application/x-troff-man', 
    'me'  => 'application/x-troff-me', 
    'ms'  => 'application/x-troff-ms', 
    'ustar'  => 'application/x-ustar', 
    'src'  => 'application/x-wais-source', 
    'xhtml'  => 'application/xhtml+xml', 
    'xht'  => 'application/xhtml+xml', 
    'xslt'  => 'application/xslt+xml', 
    'xml'  => 'application/xml', 
    'xsl'  => 'application/xml', 
    'dtd'  => 'application/xml-dtd', 
    'zip'  => 'application/zip', 
    'au'  => 'audio/basic', 
    'snd'  => 'audio/basic', 
    'mid'  => 'audio/midi', 
    'midi'  => 'audio/midi', 
    'kar'  => 'audio/midi', 
    'mpga'  => 'audio/mpeg', 
    'mp2'  => 'audio/mpeg', 
    'mp3'  => 'audio/mpeg', 
    'aif'  => 'audio/x-aiff', 
    'aiff'  => 'audio/x-aiff', 
    'aifc'  => 'audio/x-aiff', 
    'm3u'  => 'audio/x-mpegurl', 
    'wma'  => 'audio/x-ms-wma', 
    'wax'  => 'audio/x-ms-wax', 
    'ram'  => 'audio/x-pn-realaudio', 
    'ra'  => 'audio/x-pn-realaudio', 
    'rm'  => 'application/vnd.rn-realmedia', 
    'wav'  => 'audio/x-wav', 
    'pdb'  => 'chemical/x-pdb', 
    'xyz'  => 'chemical/x-xyz', 
    'bmp'  => 'image/bmp', 
    'cgm'  => 'image/cgm', 
    'gif'  => 'image/gif', 
    'ief'  => 'image/ief', 
    'jpeg'  => 'image/jpeg', 
    'jpg'  => 'image/jpeg', 
    'jpe'  => 'image/jpeg', 
    'png'  => 'image/png', 
    'svg'  => 'image/svg+xml', 
    'tiff'  => 'image/tiff', 
    'tif'  => 'image/tiff', 
    'djvu'  => 'image/vnd.djvu', 
    'djv'  => 'image/vnd.djvu', 
    'wbmp'  => 'image/vnd.wap.wbmp', 
    'ras'  => 'image/x-cmu-raster', 
    'ico'  => 'image/x-icon', 
    'pnm'  => 'image/x-portable-anymap', 
    'pbm'  => 'image/x-portable-bitmap', 
    'pgm'  => 'image/x-portable-graymap', 
    'ppm'  => 'image/x-portable-pixmap', 
    'rgb'  => 'image/x-rgb', 
    'xbm'  => 'image/x-xbitmap', 
    'psd'  => 'image/x-photoshop', 
    'xpm'  => 'image/x-xpixmap', 
    'xwd'  => 'image/x-xwindowdump', 
    'eml'  => 'message/rfc822', 
    'igs'  => 'model/iges', 
    'iges'  => 'model/iges', 
    'msh'  => 'model/mesh', 
    'mesh'  => 'model/mesh', 
    'silo'  => 'model/mesh', 
    'wrl'  => 'model/vrml', 
    'vrml'  => 'model/vrml', 
    'ics'  => 'text/calendar', 
    'ifb'  => 'text/calendar', 
    'css'  => 'text/css', 
    'csv'  => 'text/csv', 
    'html'  => 'text/html', 
    'htm'  => 'text/html', 
    'txt'  => 'text/plain', 
    'asc'  => 'text/plain', 
    'rtx'  => 'text/richtext', 
    'rtf'  => 'text/rtf', 
    'sgml'  => 'text/sgml', 
    'sgm'  => 'text/sgml', 
    'tsv'  => 'text/tab-separated-values', 
    'wml'  => 'text/vnd.wap.wml', 
    'wmls'  => 'text/vnd.wap.wmlscript', 
    'etx'  => 'text/x-setext', 
    'mpeg'  => 'video/mpeg', 
    'mpg'  => 'video/mpeg', 
    'mpe'  => 'video/mpeg', 
    'qt'  => 'video/quicktime', 
    'mov'  => 'video/quicktime', 
    'mxu'  => 'video/vnd.mpegurl', 
    'm4u'  => 'video/vnd.mpegurl', 
    'flv'  => 'video/x-flv', 
    'asf'  => 'video/x-ms-asf', 
    'asx'  => 'video/x-ms-asf', 
    'wmv'  => 'video/x-ms-wmv', 
    'wm'  => 'video/x-ms-wm', 
    'wmx'  => 'video/x-ms-wmx', 
    'avi'  => 'video/x-msvideo', 
    'ogv'  => 'video/ogg', 
    'movie'  => 'video/x-sgi-movie', 
    'ice'  => 'x-conference/x-cooltalk'); 
    if (isset($mimeTypes[$bName])) 
     $mime_type = $mimeTypes[$bName]; 
    else 
     $mime_type = 'application/octet-stream'; 
} 
+0

Por cierto, todos mis archivos descargables serán PDF – MB34

+4

Si usted tiene acceso al código, y que conoce todos sus archivos estarán archivos PDF, usted podría simplemente difícil que el código de la función de detección de tipo (s) para devolver "application/pdf" ... – cHao

+0

Eso es lo que estamos haciendo por ahora pero, en caso de que comencemos a ofrecer otros tipos, necesito ser más flexible. – MB34

Respuesta

0

Puesto que usted tiene acceso al código, se puede cambiar el método de guardar un archivo en el que se convierte en el hash y añadir algunos bloques de código:
1) Antes de guardar el archivo, guarde la extensión usted mismo.
2) Después de generar el hash, añada la extensión al archivo y guárdela o regístrela en algún lugar (archivo de datos, databae, etc.)
3) y actualice en cualquier lugar que se genere el hash para tener en cuenta la extensión.

esto podría no ser una solución para el problema real con el software, pero se le debería permitir conservar el tipo de archivo ...

+0

I fue capaz de cambiar el código forzando el tipo mime basado en la extensión del display_filename, que es el nombre del archivo que obtiene el diálogo de descarga. – MB34

Cuestiones relacionadas