Sitecore WFFM FileUploadField
There are already some blogpost around about custom FileUploadFields, but as things have changed a bit in the latest Web Forms for Marketers releases and certainly with the introduction of MVC in WFFM I thought it could be useful to share the custom field we created on a Sitecore 8.1 update-1 environment with MVC forms.Let's start by creating some validation attributes...
Validation attributes
Validation for file size
We inherit from DynamicValidationBase and override ValidateFieldValue.
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
public sealed class LimitFileSizeAttribute : DynamicValidationBase
{
private const string FileSizeLimitKey = "filesizelimit";
private const string ErrorMessageKey = "filesizelimiterror";
protected override ValidationResult ValidateFieldValue(IViewModel model, object value, ValidationContext validationContext)
{
// Required attribute should handle null value
if (value == null)
{
return ValidationResult.Success;
}
var fileBase = value as HttpPostedFileBase;
if (fileBase == null)
{
return new ValidationResult(ErrorMessage);
}
var fileUploadField = validationContext.ObjectInstance as FileUploadField;
var limit = GetLimit(fileUploadField);
if (limit == -1) // Limit not set
{
return ValidationResult.Success;
}
if (fileBase.ContentLength > limit)
{
return new ValidationResult(GetErrorMessage(fileUploadField));
}
return ValidationResult.Success;
}
private static int GetLimit(IViewModel field)
{
if (field == null || !field.Parameters.ContainsKey(FileSizeLimitKey))
{
return -1;
}
var parameter = field.Parameters[FileSizeLimitKey];
int intValue;
if (int.TryParse(parameter, out intValue))
{
return intValue;
}
return -1;
}
private string GetErrorMessage(IViewModel field)
{
if (field != null && field.Parameters.ContainsKey(ErrorMessageKey))
{
return field.Parameters[ErrorMessageKey];
}
return ErrorMessage;
}
}
Validation for allowed extensions
We can create a similar class to validate the extension by using the Path.GetExtension(fileBase.FileName). Of course, other validations are also possible.
MVC Restricted FileUploadField
We inherit from the base FileUploadField in Sitecore.Forms.Mvc.ViewModels.Fields and override the "Value" property, just to add the custom created attributes.
public class RestrictedUploadField : Sitecore.Forms.Mvc.ViewModels.Fields.FileUploadField
{
[LimitAllowedExtensions]
[LimitFileSize]
public override HttpPostedFileBase Value { get; set; }
}
Register in Sitecore
The new custom field needs to be registered in Sitecore:
Usage
Now we can start using our field in a mvc form. Do not forget to fill in the necessary parameters and/or Localized parameters - in case of our example code with the file size limit these are:
- Parameters : <FileSizeLimit>10485760</FileSizeLimit>
- Localized parameters : <FileSizeLimitError>File size must be under 10 mb</FileSizeLimitError>
I did not present you a complete FileUpload module here, but the given examples should provide enough information to get you started in your quest to create a customized file upload field in Sitecore WFFM with MVC.