You can use the cffile
tag to work with files on the server in several ways:
You use the action
attribute to specify any of the following file actions: upload
, move
, rename
, copy
, delete
, read
, readBinary
, write
, and append
. The required attributes depend on the action
specified. For example, if action="write"
, ColdFusion expects the attributes associated with writing a text file.
Note: Consider the security and logical structure of directories on the server before allowing users access to them. You can disable the cffile
tag in the ColdFusion Administrator. Also, to access files that are not located on the local ColdFusion Server system, ColdFusion services must run using an account with permission to access the remote files and directories.
File uploading requires that you create two files:
The following procedures describe how to create these files.
<head><title>Specify File to Upload</title></head> <body> <h2>Specify File to Upload</h2> <!--- the action attribute is the name of the action page ---> <form action="uploadfileaction.cfm" enctype="multipart/form-data" method="post"> <p>Enter the complete path and filename of the file to upload: <input type="file" name="FiletoUpload" size="45"> </p> <input type="submit" value="Upload"> </form> </body>
Note: The form will not work until you write an action page for it (see the next procedure).
The following table describes the code and its function:
The user can enter a file path or browse the system and select a file to send.
<html> <head> <title>Upload File</title> </head> <body> <h2>Upload File</h2> <cffile action="upload" destination="c:\temp\" nameConflict="overwrite" fileField="Form.FiletoUpload"> <cfoutput> You uploaded #cffile.ClientFileName#.#cffile.ClientFileExt# successfully to #cffile.ServerDirectory#. </cfoutput> </body> </html>
destination="c:\temp\"
Note: This directory must exist on the server.
uploadfileform.cfm
in the browser, enter a file to upload, and submit the form.The file you specified uploads, as the following figure shows:
The following table describes the code and its function:
Code |
Description |
---|---|
<cffile action="upload" |
Output the name and location of the uploaded file on the client machine. |
destination="c:\temp\" |
Specify the destination of the file. |
nameConflict="overwrite" |
If the file already exists, overwrite it. |
fileField="Form.FiletoUpload"> |
Specify the name of the file to upload. Do not enclose the variable in pound signs. |
You uploaded #cffile.ClientFileName#.#cffile. ClientFileExt# successfully to #cffile.ServerDirectory#. |
Inform the user of the file that was uploaded and its destination. For information on cffile scope variables, see "Evaluating the results of a file upload". |
Note: This example performs no error checking and does not incorporate any security measures. Before deploying an application that performs file uploads, be sure to incorporate both error handling and security. For more information, see Chapter 16, "Securing Applications" and Chapter 14, "Handling Errors".
When you save a file to the server, there is a risk that a file with the same name might already exist. To resolve this problem, assign one of these values to the nameConflict
attribute of the cffile
tag:
Error
(default) ColdFusion stops processing the page and returns an error. The file is not saved.
Skip
Allows custom behavior based on file properties. Neither saves the file nor returns an error.Overwrite
Overwrites a file that has the same name as the uploaded file.MakeUnique
Generates a unique filename for the uploaded file. The name is stored in the file object variables serverFile and serverFileName. You can use this variable to record the name used when the file was saved. The unique name might not resemble the attempted name. For more information on file upload status variables, see "Evaluating the results of a file upload".For some applications, you might want to restrict the type of file that is uploaded. For example, you might not want to accept graphic files in a document library.
You use the accept
attribute to restrict the type of file that you allow in an upload. When an accept
qualifier is present, the uploaded file's MIME content type must match the criteria specified or an error occurs. The accept
attribute takes a comma-separated list of MIME data names, optionally with wildcards.
A file's MIME type is determined by the browser. Common types, such as image/gif and text/plain, are registered in the browser.
Note: Modern versions of Internet Explorer and Netscape support MIME type associations. Other browsers and older versions might ignore these associations.
ColdFusion saves any uploaded file if you omit the accept
attribute or specify "*/*". You can restrict the file types, as demonstrated in the following examples.
The following cffile
tag saves an image file only if it is in the GIF format:
<cffile action="Upload"
fileField="Form.FiletoUpload" destination="c:\uploads\" nameConflict="Overwrite" accept="image/gif">
The following cffile
tag saves an image file only if it is in GIF or JPEG format:
<cffile action="Upload"
fileField="Form.FiletoUpload" destination="c:\uploads\" nameConflict="Overwrite" accept="image/gif, image/jpeg">
Note: If you receive an error similar to "The MIME type of the uploaded file (image/jpeg) was not accepted by the server", enter accept="image/pjpeg"
to accept JPEG files.
This cffile
tag saves any image file, regardless of the format:
<cffile action="Upload"
fileField="Form.FiletoUpload" destination="c:\uploads\" nameConflict="Overwrite" accept="image/*">
In Windows, you specify file attributes using the cffile
attributes
attribute. In UNIX, you specify file or directory permissions using the mode
attribute of the cffile
or cfdirectory
tag.
In Windows, you can set the following file attributes:
To specify several attributes in CFML, use a comma-separated list for the attributes
attribute; for example, attributes="ReadOnly,Archive"
. If you do not use attributes
, the file's existing attributes are maintained. If you specify any other attributes in addition to Normal, the additional attribute overrides the Normal setting.
In UNIX, you can individually set permissions on files and directories for each of three types of users-owner, group, and other. You use a number for each user type. This number is the sum of the numbers for the individual permissions allowed. Values for the mode
attribute correspond to octal values for the UNIX chmod
command:
You enter permissions values in the mode
attribute for each type of user: owner, group, and other in that order. For example, use the following code to assign read permissions for everyone:
mode=444
To give a file or directory owner read/write/execute permissions and read only permissions for everyone else:
mode=744
After a file upload is completed, you can retrieve status information using file upload status variables. This status information includes data about the file, such as its name and the directory where it was saved.
You can access file upload status variables using dot notation, using either file.varname or cffile.varname. Although you can use either the File or cffile prefix for file upload status variables, cffile is preferred; for example, cffile.ClientDirectory. The File prefix is retained for backward compatibility.
Note: File status variables are read-only. They are set to the results of the most recent cffile
operation. If two cffile
tags execute, the results of the first are overwritten by the subsequent cffile
operation.
The following table describes the file upload status variables that are available after an upload:
Variable |
Description |
---|---|
attemptedServerFile |
Initial name that ColdFusion uses when attempting to save a file; for example, myfile.txt. (see "Resolving conflicting filenames"). |
clientDirectory |
Directory on the client's system from which the file was uploaded. |
clientFile |
Full name of the source file on the client's system with the file extension; for example, myfile.txt. |
clientFileName |
Name of the source file on the client's system without an extension; for example, myfile. |
clientFileExt |
Extension of the source file on the client's system without a period; for example, txt (not .txt). |
contentType |
MIME content type of the saved file; for example, image for image/gif . |
contentSubType |
MIME content subtype of the saved file; for example, gif for image/gif . |
dateLastAccessed |
Date that the uploaded file was last accessed. |
fileExisted |
Indicates (Yes or No) whether the file already existed with the same path. |
fileSize |
Size of the uploaded file. |
fileWasAppended |
Indicates (Yes or No) whether ColdFusion appended the uploaded file to an existing file. |
fileWasOverwritten |
Indicates (Yes or No) whether ColdFusion overwrote a file. |
fileWasRenamed |
Indicates (Yes or No) whether the uploaded file was renamed to avoid a name conflict. |
fileWasSaved |
Indicates (Yes or No) whether ColdFusion saved the uploaded file. |
oldFileSize |
Size of the file that was overwritten in the file upload operation. Empty if no file was overwritten. |
serverDirectory |
Directory where the file was saved on the server. |
serverFile |
Full name of the file saved on the server with the file extension; for example, myfile.txt. |
serverFileName |
Name of the file saved on the server without an extension; for example, myfile. |
serverFileExt |
Extension of the file saved on the server without a period; for example, txt (not .txt). |
timeCreated |
Date and time the uploaded file was created. |
timeLastModified |
Date and time of the last modification to the uploaded file. |
With cffile
, you can create application pages to manage files on your web server. You can use the tag to move files from one directory to another, rename files, copy a file, or delete a file.
The examples in the following table show static values for many of the attributes. However, the value of all or part of any attribute in a cffile
tag can be a dynamic parameter.
This example sets the archive bit for the uploaded file:
<cffile action="Copy"
source="c:\files\upload\keymemo.doc" destination="c:\files\backup\" attributes="Archive">
Note: Ensure you include the trailing slash (\) when you specify the destination directory. Otherwise, ColdFusion treats the last element in the pathname as a filename. This only applies to copy actions.
In addition to managing files on the server, you can use cffile
to read, create, and modify text files. As a result, you can do the following things:
cflog
to create and write to log files.)
You can use cffile
to read an existing text file. The file is read into a local variable that you can use anywhere in the application page. For example, you could read a text file and then insert its contents into a database, or you could read a text file and then use one of the string replacement functions to modify the contents.
<html> <head> <title>Read a Text File</title> </head> <body> Ready to read the file:<br> <cffile action="read" file="C:\inetpub\wwwroot\mine\message.txt" variable="Message"> <cfoutput> #Message# </cfoutput> </body> </html>
You can use cffile
to write a text file based on dynamic content. For example, you could create static HTML files or log actions in a text file.
<html> <head> <title>Put Information into a Text File</title> </head> <body> <h2>Put Information into a Text File</h2> <form action="writetextfileaction.cfm" method="Post"> <p>Enter your name: <input type="text" name="Name" size="25"></p> <p>Enter the name of the file: <input type="text" name="FileName" size="25">.txt</p> <p>Enter your message: <textarea name="message"cols=45 rows=6></textarea> </p> <input type="submit" name="submit" value="Submit"> </form> </body> </html>
.
Note: The form will not work until you write an action page for it (see the next procedure).
<html> <head> <title>Write a Text File</title> </head> <body> <cffile action="write" file="C:\inetpub\wwwroot\mine\#Form.FileName#.txt" output="Created By: #Form.Name# #Form.Message# "> </body> </html>
writetextfileform.cfm
in the browser, enter values, and submit the form; as shown in the following figure.
The text file is written to the location you specified. If the file already exists, it is replaced.
You can use cffile
to append additional text to the end of a text file; for example, when you create log files.
action
attribute from write
to append
so that the file appears as follows:<html> <head> <title>Append a Text File</title> </head> <body> <cffile action="append" file="C:\inetpub\wwwroot\mine\message.txt" output="Appended By: #Form.Name#"> </body> </html>
The appended information displays at the end of the text file.