Avec CF8 et compatible:
<cffunction name="IsRtfFile" returntype="Boolean" output="false">
<cfargument name="FileName" type="String" />
<cfreturn Left(FileRead(Arguments.FileName),5) EQ '{\rtf' />
</cffunction>
Pour les versions antérieures:
<cffunction name="IsRtfFile" returntype="Boolean" output="false">
<cfargument name="FileName" type="String" />
<cfset var FileData = 0 />
<cffile variable="FileData" action="read" file="#Arguments.FileName#" />
<cfreturn Left(FileData,5) EQ '{\rtf' />
</cffunction>
Mise à jour: Une meilleure CF8/réponse compatible. Pour éviter de charger le fichier en mémoire, vous pouvez effectuer les opérations suivantes pour charger seulement les premiers caractères:
<cffunction name="IsRtfFile" returntype="Boolean" output="false">
<cfargument name="FileName" type="String" />
<cfset var FileData = 0 />
<cfloop index="FileData" file="#Arguments.FileName#" characters="5">
<cfbreak/>
</cfloop>
<cfreturn FileData EQ '{\rtf' />
</cffunction>
Sur la base des commentaires:
Voici un moyen très rapide comment vous pourrait faire un type de fonction "quel format est-ce". Pas parfait, mais ça vous donne l'idée ...
<cffunction name="determineFileFormat" returntype="String" output="false"
hint="Determines format of file based on header of the file's data."
>
<cfargument name="FileName" type="String"/>
<cfset var FileData = 0 />
<cfset var CurFormat = 0 />
<cfset var MaxBytes = 8 />
<cfset var Formats =
{ WordNew : 'D0,CF,11,E0,A1,B1,1A,E1'
, WordBeta : '0E,11,FC,0D,D0,CF,11,E0'
, Rtf : '7B,5C,72,74,66' <!--- {\rtf --->
, Jpeg : 'FF,D8'
}/>
<cfloop index="FileData" file="#Arguments.FileName#" characters="#MaxBytes#">
<cfbreak/>
</cfloop>
<cfloop item="CurFormat" collection="#Formats#">
<cfif Left(FileData , ListLen(Formats[CurFormat])) EQ convertToText(Formats[CurFormat]) >
<cfreturn CurFormat />
</cfif>
</cfloop>
<cfreturn "Unknown"/>
</cffunction>
<cffunction name="convertToText" returntype="String" output="false">
<cfargument name="HexList" type="String" />
<cfset var Result = "" />
<cfset var CurItem = 0 />
<cfloop index="CurItem" list="#Arguments.HexList#">
<cfset Result &= Chr(InputBaseN(CurItem,16)) />
</cfloop>
<cfreturn Result />
</cffunction>
Bien sûr, intéressant de souligner que tout cela ne fonctionnera pas sur les formats 'de', y compris sans en-tête beaucoup de ceux à base de texte commun (CFM, CSS, JS, etc.).
C'est parfait! Par curiosité, cette technique pourrait-elle être utilisée pour détecter la version de Word avec laquelle le document a été créé? J'ai rencontré un autre problème où POI est en train de créer un ajustement sur un fichier qui, selon lui, a été créé avec Word 95. Sinon, pourrais-je simplement abandonner complètement les POI et charger les données tirées avec FileRead() et les charger dans la DB façon? En fin de compte, mon but est simplement d'avoir le texte du document disponible pour la recherche mais pas l'affichage. –
Si vous pouvez identifier les séquences de marqueurs de fichier pour les différentes versions, cette technique pourrait être utilisée pour plusieurs formats, puisque beaucoup de formats de fichiers binaires commencent par jusqu'à 8 octets qui identifient le format de cette façon. –
Pour lire les fichiers entiers ... bien, en utilisant FileRead traitera les fichiers en tant que texte - donc je ne sais pas si cela pourrait corrompre un document Word. Si c'est le cas, vous pouvez essayer FileReadBinary, mais je ne suis pas sûr alors si elle serait consultable en tant que texte dans votre base de données. –