This is a ColdBox Module to simplify and standardize the process of receiving file uploads. Support was added in 1.1.0 to receive file uploads as encoded data in a payload. This makes it possible to configure tests with a request body that includes the file content as a big string, rather than require the testing framework to make traditional multipart POSTs or have access to a filesystem stocked with test files.
- Lucee 5.2.8+ or Adobe ColdFusion 11+
- ColdBox 4.3+
- Java 8+
- Apache Commons Codec 1.9+ (provided by modern CFML engines)
Install using CommandBox:
box install file-upload-helper
Get a reference to the FileUploadService
in your handler, for example:
property name="fileUploadService" inject="fileUploadService@FileUploadHelper";
When a file is POSTed to your application using multipart/form-data, use the service to retrieve it from the request body:
var uploadedFile = variables.fileUploadService.processUpload("aFileFormField");
A client (a browser or a testing framework) may upload a file where the content is part of a structured payload. Consider a POST where the content-type is application/json
and the raw body looks like the following:
{
"inElement": false,
"filename": "donny.html",
"filedata": "PCFkb2N0eXBlIGh0bWw+CjxodG1sPgo8aGVhZD4KCTx0aXRsZT5Eb25ueTwvdGl0bGU+CjwvaGVhZD4KPGJvZHk+Cgk8aDE+RG9ubnk8L2gxPgoJPHA+RG9ubnkgd2FzIGEgZ29vZCBib3dsZXIsIGFuZCBhIGdvb2QgbWFuLiBIZSB3YXMgb25lIG9mIHVzLjwvcD4KPC9ib2R5Pgo8L2h0bWw+Cgo=",
"commitTo": "Bosom of the Pacific Ocean"
}
When that sample content is received, it can be processed with FileUploadService
to product a File
in the same way as processUpload()
above.
var payload = deserializeJson(getHttpRequestData().content);
var uploadedFile = variables.fileUploadService.processUploadAsData(payload.filename, payload.filedata);
These are the public methods from File
that are now available:
Method | Description |
---|---|
getPath() | Returns the full filesystem path to the file. |
getName() | Returns the filename, as provided in the request body. |
getExtension() | Returns the file extension, as provided in the request body. |
getContentType() | Returns the content type of the file based solely on the file extension. A modest number of popular content types are known; the default is application/octet-stream. |
getSize() | Returns the number of bytes used by the file. |
getFormattedSize() | Returns a string like "25.1 Kb" or "10.2 Mb" representing the file size (1 Kb = 1024 bytes). |
getHash([algorithm:string]) | By default, returns the SHA-2 256-bit digest of the uploaded file. Specify SHA-1 if needed. |
exists() | Returns a boolean indicating if the CFML engine thinks the file really exists. |
delete() | Use this method to remove the file from the filesystem when it's no longer needed. |
To execute the test suite -- modest as it is -- install the dependency and call the test runner:
$ box
CommandBox> package install
CommandBox> server start
CommandBox> testbox run
See the LICENSE file for license rights and limitations (MIT).