2010-01-20 8 views
7

Tengo una aplicación que permite a los administradores cargar archivos. Estos archivos se almacenan fuera de la raíz web, por lo que no se puede acceder a ellos a través de una URL. En el pasado, siempre usamos un código similar al siguiente para devolver el archivo a los usuarios autorizados. ¿Hay una forma mejor o más universal para especificar el tipo? Esto es especialmente relevante cuando los administradores pueden cargar muchos tipos diferentes de archivos.Creación de una página de descarga en ColdFusion 8

<cfheader name="content-disposition" value="filename=#queryname.filename#"> 
<cfcontent type="application/unknown" file="#application.pathToDataDirectory#/#queryname.filename#"> 

Respuesta

6

Por lo que sé, no creo que haya un "tipo mime" real escrito en ningún tipo de archivo. Es solo algo que le da al navegador una advertencia sobre lo que viene en camino.

Aquí se mencionan varias funciones "smart mime-type" (tenga en cuenta el segundo comentario también). No he probado esto, pero debe ajustarse a sus necesidades: http://www.coldfusionmuse.com/index.cfm/2006/8/2/mime.types

Si quería escribir su propia función "inteligente mime-tipo", se podía convertir fácilmente esta función PHP en ColdFusion: http://snipplr.com/view/11451/get-file-mimetype/

+0

terminamos recreando la función PHP, gracias – Jason

1

con cierto retraso , pero ¿por qué no captura y guarda el tipo MIME cuando se carga el archivo? <cffile> lo devuelve en cffile.contentType y cffile.contentSubType, por lo que no es exactamente oneroso. Tendría que ejecutar un barrido en los archivos preexistentes, por supuesto, pero eso es una sola vez con guión fácil.

FWIW, el código de descarga de mi archivo también envía el tamaño del archivo y la fecha de modificación, y comprueba las nuevas solicitudes de archivos no modificados. Todo esto después de verificaciones de autenticación/autorización, por supuesto:

<cfset modified=parsedatetime(queryname.datestamp)/> 

<cfif structkeyexists(cgi, "http_if_modified_since")> 
<cfif parsedatetime(cgi.http_if_modified_since) gt modified> 
    <cfheader statuscode=304 statustext="Not modified"/> 
    <cfabort/> 
</cfif> 
</cfif> 

<cfheader name="Content-Disposition" value='disposition=#disposition#; filename="#queryname.filename#"'/> 
<cfheader name="Content-Length" value=#queryname.size#/> 
<cfheader name="Last-Modified" value=#gethttptimestring(modified)#/> 
<cfcontent type=#queryname.mimetype# file="application.pathToDataDirectory/#queryname.filename#"/> 
Cuestiones relacionadas