Throwing And Catching A File Using CFHttp For Both Actions
Posted April 2, 2007 at 1:25 PM
I can't remember where I heard this, but not so long ago I heard or read about someone who wanted to send a file to another server using CFHttp. He didn't have any FTP stuff set up, so that was they best idea he had. This seemed like a fun little piece of functionality to test as I have never done that before.
I set up two pages: cfhttp_throw.cfm and cfhttp_catch.cfm. As you can probably guess, the cfhttp_throw.cfm takes a file from the local file system and "posts" it to the cfhttp_catch.cfm. The cfhttp_catch.cfm file then "uploads" it to its server and echoes back the file name as it was stored on the new machine.
This was suprisingly easy. I have not used CFHttp all that extensively and in about 10 minutes I worked out something that did just what I wanted to do. And, in the process, I used a CFHttpParam tag of type "File" which I had never done before. I have to go back and check out the rest of the CFHttpParam types to see what else I am missing (damn you ignorance!).
Here is the cfhttp_throw.cfm code. It doesn't have all the CFTry / CFCatch tags that probably should be used, but for this proof of concept, it was not necessary:
Launch code in new window » Download code as text file »
- <!---
- Submit the file the CFHTTP_Catch.cfm file. Notice that we
- are sending the file via a CFHttpParam FILE tag. By using
- this file param, CFHTTP automatically sends all form
- fields as multi-part form data; therefore, we do NOT need
- to specify the "multipart='true'" CFHttp attribute.
- --->
- <cfhttp
- url="http://swoop/..../cfhttp_catch.cfm"
- method="POST"
- useragent="Mozilla/5.0 Gecko/20070309 Firefox/2.0.0.3"
- result="objHTTP">
-
- <!---
- Send along a file via the FORM post. This acts the same
- as a stanard form Input type="file" field and can be
- handled as such on the "Catch" page.
- --->
- <cfhttpparam
- type="FILE"
- name="file"
- file="#ExpandPath( './test.jpg' )#"
- />
-
- </cfhttp>
-
-
- <cfoutput>
-
- <h4>
- CFHttp Post Result:
- </h4>
-
- <p>
- #objHTTP.FileContent#
- </p>
-
- </cfoutput>
And, here is the cfhttp_catch.cfm code:
Launch code in new window » Download code as text file »
- <!--- Kill extra output. --->
- <cfsilent>
-
- <!---
- Param the form fields. Since this data is coming via
- a CFHTTP "Post" we can operate as if it was a standard
- form submission.
- --->
- <cfparam
- name="FORM.file"
- type="string"
- default=""
- />
-
-
- <!--- Try to upload the file. --->
- <cftry>
-
- <!---
- Upload the file. When defining the CFFile, we can
- treat the posted file as if it was submitted via a
- standard File Input (since it was posted as a FILE
- using CFHttpParam).
- --->
- <cffile
- action="UPLOAD"
- filefield="file"
- destination="#ExpandPath( './files/' )#"
- nameconflict="MAKEUNIQUE"
- />
-
-
- <!---
- Echo back the name of the file as it has been
- saved to the server.
- --->
- <cfcontent
- type="text/plain"
- variable="#ToBinary( ToBase64( CFFILE.ServerFile ) )#"
- />
-
-
- <!---
- Catch any errors that were thrown during the
- file upload.
- --->
- <cfcatch>
-
- <!--- Echo back the error message. --->
- <cfcontent
- type="text/plain"
- variable="#ToBinary( ToBase64( CFCATCH.Message ) )#"
- />
-
- </cfcatch>
- </cftry>
-
- </cfsilent>
That was pretty cool. I like that using the proper CFHttp / CFHttpParam tags, your target page can act as if the request was coming from a standard Form-action page with standard FORM-scoped values. I think it's totally awesome that CFFile can actually upload the file that is posted to it. Very cool.
Download Code Snippet ZIP File
Post Comment | Ask Ben | Permalink | Other Searches | Print Page
Newer Post
The Shield Start Tomorrow!
Older Post
Ask Ben: Limiting The Amount Of Time A Block Of Code Can Run (Attempt II)
Reader Comments
What is the deal with this?
#ToBinary( ToBase64( CFFILE.ServerFile ) )#
CFFILE.* should all be strings. So why not just output as is?
@Ray,
Cause I am a sick person .... the Variable attribute of CFContent only takes binary data and won't allow string data unless you convert it to binary first (hence the ToBinary stuff). Sure, I could just output it after the CFSilent, but I don't think that looks as nice.... Like I said, I am sick (in the head) and code formatting is that special to me :)
Plus, I just really like using CFContent. Feels so good.
Hah, that is insane.
What fun would "sane" be ;)




