4

大家好,我想在WFFM(sitecore)中创建一个“告诉朋友喜欢的表格”,但我还添加了一个在表格中附加文件的功能,这工作正常。现在我想禁止用户附加超过 1 MB 的大文件,因为我创建了一个新类

public class LimiteFileSize 
{
  public void Process(FormUploadFileArgs args)
  {
    int size = 1049000;

    if (args.File.Data.Length > size)
    {
      Sitecore.Diagnostics.Log.Error(string.Format("User {0} tried to upload a file larger than 10 Mb. The file name is {1}",
                                     Sitecore.Context.User.Name,
                                     args.File.FileName), this);
      args.AbortPipeline();
    }
  }
}

并在 forms.config 中注册

<formUploadFile>
  <processor type="Sitecore.Form.Core.Pipelines.FormUploadFile.ResolveFolder, Sitecore.Forms.Core"/>
  <processor type="Sitecore.Form.Core.Pipelines.FormUploadFile.Save, Sitecore.Forms.Core"/>
  <processor type="scwffm2.Helper.LimiteFileSize, scwffm2.Helper"/>  
</formUploadFile>

现在,如果我不评论或删除(这是 WFFM 中的默认保存操作)`

<processor type="Sitecore.Form.Core.Pipelines.FormUploadFile.Save, Sitecore.Forms.Core"/>

` 大文件将使用默认操作上传,如果上面的行被注释,那么它不会在数据库中保存任何文件,即使是大文件或小文件。问题是LimiteFileSize中的进程 工作正常,但它只检查文件大小,如果文件大小小于 1MB,它不会保存文件。我应该对小于 1 MB 的文件大小采用 else 条件吗???

4

2 回答 2

2

我认为你应该把你的处理器放在 Sitecore 的处理器之上,因为它们是按顺序运行的。在您的情况下,它应该是:

<formUploadFile>
    <processor type="scwffm2.Helper.LimiteFileSize, scwffm2.Helper"/>  
    <processor type="Sitecore.Form.Core.Pipelines.FormUploadFile.ResolveFolder, Sitecore.Forms.Core"/>
    <processor type="Sitecore.Form.Core.Pipelines.FormUploadFile.Save, Sitecore.Forms.Core"/>
</formUploadFile>

另一种选择是使用 jQuery 检查文件大小,确保您甚至不能首先上传文件:

$.validator.addMethod('filesize', function(value, element, param) {
    // param = size (en bytes) 
    // element = element to validate (<input>)
    // value = value of the element (file name)
    return this.optional(element) || (element.files[0].size <= param) 
});

$('#inputid').validate({
    rules: { input: { required: true, filesize: 1048576  }},
    messages: { input: "File must be less than 1MB" }
});

请注意,我尚未测试此代码,因此可能需要进行一些调整

于 2013-11-11T11:11:10.703 回答
1

由于 Trayek 解决方案强制网站上每个表单的文件大小,我想建议一个替代选项。

使用 SitecoreFormCustomValidator来验证文件是否小于特定大小,它们是为这些场景而设计的。使用以下方法,您可以为添加到表单的每个上传字段定义文件限制。

public class FileSizeValiadtor : FormCustomValidator
{
    protected override bool EvaluateIsValid()
    {
        bool isValid = false;

        var fileUpload = this.FindControl(base.ControlToValidate) as FileUpload;
        if (fileUpload != null && fileUpload.HasFile)
        {
            int fileSizeLimitinBytes = GetFileSizeLimit();

            int sizeInBytes = fileUpload.PostedFile.ContentLength;
            isValid = (sizeInBytes <= fileSizeLimitinBytes);
        }

        return isValid;
    }

然后你需要在 WFFM 验证文件夹中添加一个 BaseValidator 项,通常是这个路径;/sitecore/system/Modules/Web Forms for Marketers/Settings/Validation. 将这个新验证器的程序集和类添加到项目中。最后在 FileUpload 字段BaseValiator的字段中添加您的项目。Validation

然后是获取 FileSizeLimit 的问题,您可以从特定 Sitecore 项目的字段中获取它,甚至可以扩展FileUpload字段以让用户 de 给用户一个文本框并从那里获取值。

        [VisualFieldType(typeof(EditField))]
        [VisualProperty("Max file size limit (MB) :", 5)]
        public string FileSizeLimit
        {
            get
            {
                return this._fileSizeLimit.ToString();
            }
            set
            {
                this._fileSizeLimit = int.Parse(value);
            }
        }

有关完整示例,请参见此处

于 2015-10-11T17:52:44.570 回答