cffile

説明

サーバーファイルとの操作を管理します。

次のセクションでは、cffile タグのアクションについて説明します。

注意: このタグを実行するには、ColdFusion Administrator でタグを有効にする必要があります。詳細については、『ColdFusion 設定と管理』を参照してください。

複数のカスタマが使用するサーバーで ColdFusion アプリケーションを実行する場合、cffile でアップロードまたは操作できるファイルについて、セキュリティを考慮する必要があります。詳細については、『ColdFusion 設定と管理』を参照してください。

シンタックス

タグのシンタックスは action 属性の値によって異なります。それぞれの属性値のセクションを参照してください。

関連項目

cfdirectory

履歴

ColdFusion 10:accept 属性に対する変更

ColdFusion 9: uploadAll アクション

ColdFusion 8: cfimages の読み込みと書き込みが可能になりました。

ColdFusion MX 7:

  • result 属性が追加されました。この属性では、結果パラメータを受け取る代替変数を指定することができます。action="upload" アクションの場合に使用します。

  • action = "append" アクションと action = "write" アクションに fixnewline 属性が追加されました。

ColdFusion MX 6.1:

  • ファイルパスの必要条件が変更されました。ファイルの絶対パスを指定しなかった場合は、GetTempDirectory 関数から返される ColdFusion のテンポラリディレクトリを基準とした相対パスになります。

  • action="read" の動作が変更されました。BOM (Byte Order Mark) で始まるファイルの場合は、ColdFusion がそれを使って文字エンコードを判別します。

  • action="upload"nameConflict="MakeUnique" の動作が変更されました。ColdFusion はファイル名の最後に増分番号を付加することで、固有の名前を作成します (1 番目のファイルには 1 を付け、2 番目のファイルには 2 を付ける、という具合です)。ColdFusion では、各ファイルの名前に "1" を付加することで固有の名前を作成していました (つまり、1、11、111、という具合です)。

ColdFusion MX:

  • パス内のスラッシュの使い方が変更されました。UNIX システムでも Windows システムでも、パス内にスラッシュ (/) または円記号 (¥) を使用することができます。

  • ファイル階層の必要条件が変更されました。このタグで操作するファイルやディレクトリを、Web サーバーのドキュメントディレクトリのルートの下に置く必要はありません。

  • destination 属性のディレクトリパスの必要条件が変更されました。destination 属性で指定するディレクトリパスには、末尾のスラッシュを付ける必要はありません。

  • attributes 属性の system 値が非推奨になりました。

  • attributes 属性の temporary 値が非推奨になりました。ColdFusion では、これは normal と同義です。このタグは、これ以降のリリースでは機能しない可能性があります。

  • action 属性の readwriteappendmove オプションが変更されました。これらのオプションは、charset という新しい属性をサポートします。

  • attributes 属性の archive 値は廃止されたため、効果はありません。

タグ本文でのファイルコンテンツの指定

cffile action = "append" および cffile action = "write" の場合、タグ本文でファイルコンテンツを指定できます。

タグ本文と output 属性の両方でファイルコンテンツを指定した場合は、エラーが発生します。

次の例では、本文で指定したテキストが、現在のディレクトリの myfile.txt に書き込まれます。

ファイルが存在しない場合は、新しい myfile.txt ファイルが作成されます。ファイルが存在する場合は上書きされます。

<!--- In this case, file content is passed via both - output attribute and inside tag body. Tag body will get preference ---> 
<cfset filename = expandpath('./myfile.txt')> 
<cftry> 
    <cffile action="write" file="#filename#"> 
        some tag body 
    </cffile> 
    <cfset content = FileRead(filename)> 
    <cfoutput>File Length = #Len(content)#</cfoutput> 
<cfcatch type="any"> 
    <cfoutput> 
        #cfcatch.message# 
        <br>#cfcatch.detail# 
        <br> 
    </cfoutput> 
</cfcatch> 
</cftry>

同様に、cffile action="append" を使用すると、タグ本文の内容が myfile.txt ファイルの内容に追加されます。

空のファイルを作成するには、次のコードに示すように、タグ本文で最低 1 行の空の行を指定する必要があります。

<cffile action="write" file="#filename#"> 
    <!--- Leave a blank line here---> 
</cffile>

ColdFusion 10 での accept 属性に対する変更

accept 属性では、任意またはすべての拡張子のカンマ区切りリスト、MIME タイプ、または MIME タイプのリストを値として使用します。

拡張子は、. の接頭辞を使用して指定します。正確に言うと、.txt のみがサポートされ、txt*.txt*.* はサポートされません。ただし、すべてのファイルを受け入れるワイルドカードとして * を使用できます。

  • ファイル名の拡張子を値として指定した場合、ファイルがチェックされ、カンマ区切りリストで指定した拡張子のリストにファイルが一致するかどうかのみが確認されます。一致した場合、ファイルがアップロードされます。

  • 値が MIME タイプまたは MIME タイプのリストでありstrict 属性を true に設定した場合は、ファイルの最初の数バイトが読み込まれ、MIME タイプが判別されます。指定したものと MIME タイプが一致した場合はアップロードが実行され、そうでない場合はエラーが発生します。strict のデフォルト値は false です。

  • ファイル名の拡張子と MIME タイプの両方を指定しstrictfalse に設定した場合は、値を指定した順序に基づいて検証が行われます。例えば、最初の値が .txt である場合、.txt ファイルがアップロードされます。

    strict を true に設定した場合、拡張子は無視されます。

例:accept 属性を使用したファイル名の拡張子の検証

upload.cfm

<cftry> 
    <cfset variables.URL = "http://#cgi.server_name#:#cgi.server_port##getDirectoryFromPath(cgi.script_name)#_upload.cfm"> 
    <cfhttp method="Post" url="#variables.URL#"> 
        <cfhttpparam type="FILE" name="myfile" file="#expandpath('./sample.txt')#"> 
    </cfhttp> 
    <cfoutput>#cfhttp.filecontent#</cfoutput> 
<cfcatch> 
    <cfoutput> 
        #CFCATCH.message# 
        <br>#CFCATCH.detail# 
        <br> 
    </cfoutput> 
</cfcatch> 
</cftry>

_upload.cfm

<cfset uploadDirectory = "#GetTempDirectory()#cf_upload"> 
<!--- create upload directory  ---> 
<cfif not directoryExists(uploadDirectory)> 
    <cfdirectory action="create" directory="#uploadDirectory#"> 
</cfif> 
<cftry> 
    <cffile action="UPLOAD" destination="#uploadDirectory#" filefield="form.myFile" 
            nameconflict="MAKEUNIQUE" accept=".txt"> 
<cfcatch> 
    <cfoutput> 
        #CFCATCH.message# 
        <br>#CFCATCH.detail# 
        <br> 
    </cfoutput> 
</cfcatch> 
</cftry> 
<!--- read directory ---> 
<cfdirectory action="LIST" directory="#uploadDirectory#" name="qFileList"> 
<cfoutput>#qFileList.recordcount# 
    file(s) uploaded 
    <br> 
</cfoutput> 
<!--- delete all the uploaded files---> 
<!--- 
<cfloop query="qFileList"> 
    <cffile action="delete" file="#uploadDirectory#/#Name#"> 
</cfloop> 
---> 
<!--- delete directory ---> 
<!--- 
<cfdirectory action="delete" directory="#uploadDirectory#"> 
--->

この例では、accept.txt に設定し、strict は指定しません(したがって、デフォルトの false になります)。そのため、.txt の拡張子を持つファイルのみがアップロード対象と見なされます。

ファイルがもともとは PDF(sample.pdf)で、名前が変更されて sample.txt になっている場合も、(stricttrue に設定していないので)ファイルはアップロードされます。

strict=true を指定した場合、ファイルが初めから .txt であれば(かつ他のタイプから名前が変更されたファイルでなければ)、正しい MIME タイプが指定されている場合にのみ、ファイルがアップロードされます。つまり、strict=true の場合は、accept 属性で MIME タイプを指定する必要があります。そのため、_upload.cfm で明示的に accept="text/plain" を記述する必要があります。

例 2:MIME タイプの使用

例 1 を変更して、_upload.cfm で次のように accept="application/pdf" を指定します。

<cffile action="UPLOAD" 
    destination="#uploadDirectory#" 
    filefield="form.myFile" 
    nameconflict="MAKEUNIQUE        " 
    accept="application/pdf    " 
    strict=true>

strict = true であるので、タイプが PDF のファイルのみがアップロード対象と見なされます。

別のファイルを使用するには、upload.cfm の次のセクションを変更します。

<cfhttpparam type="FILE" name="myfile" file="#expandpath('./sample.txt')#">

例 3:拡張子と MIME タイプの両方を使用

例 1 を変更して、_upload.cfm で次のように指定します。

<cffile 
    action="UPLOAD" 
    destination="#uploadDirectory#" 
    filefield="form.myFile" 
    nameconflict="MAKEUNIQUE" 
    accept=".txt, application/pdf" 
    strict=true>

strict = true であるので、PDF ファイルのみがアップロードされます。

strict を false に設定すると、両方のファイルがアップロードされます。

別のファイルを使用するには、upload.cfm の次のコードを変更します。

<cfhttpparam type="FILE" name="myfile" file="#expandpath('./sample.txt')#">

<!--- This shows how to write, read, update, and delete a file using CFFILE. 
This is a view-only example. ---> 
<!---  
<cfif IsDefined("form.formsubmit") is "Yes">  
    <!--- The form has been submitted, now do the action. --->  
    <cfif form.action is "new">  
        <!--- Make a new file. --->  
        <cffile action="Write"  
            file="#GetTempDirectory()#foobar.txt"  
            output="#form.the_text#">  
    </cfif>  
    <cfif form.action is "read">  
        <!--- Read existing file. --->  
        <cffile action="Read"  
            file="#GetTempDirectory()#foobar.txt"  
            variable="readText">  
    </cfif>  
 
    <cfif form.action is "add">  
        <!--- Update existing file. --->  
        <cffile action="Append"  
            file="#GetTempDirectory()#foobar.txt"  
            output="#form.the_text#">  
    </cfif>  
 
    <cfif form.action is "delete">  
        <!--- Delete existing fil. --->  
        <cffile action="Delete"  
            file="#GetTempDirectory()#foobar.txt">  
    </cfif>  
</cfif>  
<!--- Set some variables. --->  
<cfparam     name="fileExists"     default="no">  
<cfparam name="readText" default="">  
<!--- First, check whether canned file exists. --->  
<cfif FileExists("#GetTempDirectory()#foobar.txt") is "Yes">  
    <cfset fileExists="yes">  
</cfif>  
<!--- Now, make the form that runs the example. --->  
<form action="index.cfm" method="POST">  
<h4>Type in some text to include in your file:</h4> <p>  
<cfif fileExists is "yes">  
    <p>A file exists (foobar.txt, in <cfoutput>#GetTempDirectory()#</cfoutput>).  
    You may add to it, read from it, or delete it. </p> 
</cfif>  
<!--- If reading from a form, let that information display in textarea. --->  
<textarea name="the_text" cols="40" rows="5">  
    <cfif readText is not "">  
        <cfoutput>#readText#</cfoutput>  
    </cfif></textarea>  
<!--- Select from the actions depending on whether the file exists. --->  
<select name="action">  
<cfif fileExists is "no">  
    <option value="new">Make new file  
</cfif>  
<cfif fileExists is "yes">  
    <option value="add">Add to existing file  
    <option value="delete">Delete file  
    <option value="read">Read existing file  
</cfif>  
</select>  
<input type="Hidden" name="formsubmit" value="yes">  
<input type="Submit" name="" value="make my changes">  
</form> --->