2010-01-20 9 views
7

Mam aplikację, która pozwala administratorom na przesyłanie plików. Pliki te są przechowywane poza katalogiem głównym, więc nie są dostępne za pośrednictwem adresu URL. W przeszłości zawsze używaliśmy kodu podobnego do poniższego, aby następnie przekazać plik autoryzowanym użytkownikom. Czy istnieje lepszy lub bardziej uniwersalny sposób określania typu? Jest to szczególnie istotne, gdy administratorom można przesyłać wiele różnych typów plików.Tworzenie strony pobierania w ColdFusion 8

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

Odpowiedz

6

O ile wiem, nie sądzę, że istnieje rzeczywisty "typ mime" zapisany w jakimkolwiek pliku. To tylko coś, co daje przeglądarce ostrzeżenie o tym, co nadchodzi.

Wymieniono tutaj kilka funkcji "inteligentnego mime" (zauważ także drugi komentarz). Nie próbowałem ich, ale powinny one dostosowane do potrzeb klientów: http://www.coldfusionmuse.com/index.cfm/2006/8/2/mime.types

Jeśli chciałeś napisać własną funkcję „smart mime-type”, można łatwo przekonwertować tej funkcji PHP w ColdFusion: http://snipplr.com/view/11451/get-file-mimetype/

+0

skończyło się odtworzenie funkcji PHP, dzięki – Jason

1

Nieco spóźniony , ale dlaczego nie przechwycisz i nie zapiszesz typu MIME, gdy plik zostanie przesłany? <cffile> zwraca go w cffile.contentType i cffile.contentSubType, więc nie jest to dokładnie uciążliwe. Oczywiście, trzeba oczywiście przeglądać istniejące wcześniej pliki, ale jest to prosta opcja.

FWIW, mój kod pobierania pliku również wysyła rozmiar pliku i datę modyfikacji, a także sprawdza, czy nie ma żądanych plików. Wszystko to po sprawdzeniu autentyczności/autoryzacji, oczywiście:

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