Создание страницы загрузки в ColdFusion 8 - PullRequest
7 голосов
/ 20 января 2010

У меня есть приложение, которое позволяет администраторам загружать файлы.Эти файлы хранятся вне веб-корня, поэтому они не доступны через URL.В прошлом мы всегда использовали код, подобный приведенному ниже, чтобы затем передать файл авторизованным пользователям.Есть ли лучший или более универсальный способ указать тип?Это особенно актуально, когда администраторам разрешено загружать много разных типов файлов.

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

Ответы [ 2 ]

6 голосов
/ 20 января 2010

Насколько я знаю, я не думаю, что в любой тип файла записан фактический "mime-тип". Это просто то, что предупреждает браузер о том, что будет на его пути.

Здесь упоминаются несколько функций типа «умный пантомима» (также обратите внимание на второй комментарий). Я не пробовал это, но они должны соответствовать вашим потребностям: http://www.coldfusionmuse.com/index.cfm/2006/8/2/mime.types

Если вы хотите написать свою собственную функцию «умного пантомимы», вы можете легко преобразовать эту функцию PHP в ColdFusion: http://snipplr.com/view/11451/get-file-mimetype/

1 голос
/ 26 января 2010

Несколько запоздало, но почему бы вам не захватить и не сохранить тип MIME при загрузке файла? <cffile> возвращает его в cffile.contentType и cffile.contentSubType, так что это не совсем обременительно. Конечно, вам нужно будет выполнить проверку уже существующих файлов, но это легко запрограммировать.

FWIW, мой код загрузки файлов также отправляет размер файла и дату изменения, а также проверяет повторные запросы неизмененных файлов. Все это после проверки подлинности / авторизации, конечно:

<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#"/>
...