Plupload:在开始上传之前执行自定义检查

Plupload: perform custom check before starting upload

我有一个带有表单和 plupload 文件上传器部分的 MVC 5 视图。上传由表单上的按钮触发。将文件块上传到服务器并将参数设置为查询字符串和所有参数都没有问题,但我遇到的问题是开始上传 仅在执行自定义完整性检查后[=36] =].

这是我尝试过的:

var uploader = new plupload.Uploader({
 runtimes: 'html5',
 drop_element: 'upload',
 browse_button: 'browse',
 url: "../UploadFile",
 chunk_size: "1024kb",
 multipart_params: { "uid": "uid", "chunk": "chunk", "chunks": "chunks", "name": "name" },
 init: {
  PostInit: function(file) {
   document.getElementById("filelist").innerHTML = "";
   document.getElementById('submit-all').onclick = function () {
    document.getElementById("infoPopup").style.visibility = "visible";
    document.getElementById('submit-all').enabled = false;
    var uuid = Math.uuidFast();
    document.getElementById("uid").value = uuid;
    uploader.settings.multipart_params = { uid: uuid, chunk: file.chunk, chunks: file.chunks, name: file.name };
    if (checkReq) {
     uploader.start();
    }
    return false;
   };
  },

这里的关键部分是:

if(checkReq){ 
  uploader.start();
}

"checkReq" 是我自定义的健全性检查脚本,用于验证表单值是否无意义(例如,单个表单条目可能完全有效,但组合起来它们完全是错误的,等等)。

所以上面没有阻止上传,甚至没有触发检查脚本,Firebug控制台输出没有显示错误。

因为谷歌搜索告诉我还有一个 "BeforeUpload" 事件,所以我尝试了这个:

BeforeUpload: function(up, file) {
    if (checkReq) {
        up.stop();
        return false;
    }
    return true;
},

这似乎也根本没有开火。

编辑:下一次尝试,我将对我的 checkReq 函数的调用放到 "preinit" 中的 BeforeUpload 中,应该 在任何分块等完成之前触发,所以在准备上传。这也失败了,尽管我不知道为什么它不触发:

var uploader = new plupload.Uploader({
    runtimes: 'html5',
    drop_element: 'upload',
    browse_button: 'browse',
    url: "../UploadFile",
    chunk_size: "1024kb",
    multipart_params: { "uid": "uid", "chunk": "chunk", "chunks": "chunks", "name": "name" },

    preinit: {
        BeforeUpload: function (up) {
            if (checkReq) {
                uploader.stop();
                uploader.splice(0, uploader.files.length);
                return false;
            }
            return true;
        }
    },

    init: {
        PostInit: function(file) {
...

我以前用过 "dropzone.js",我的脚本可以很好地工作,但我发现我需要分块上传,所以我不得不转向 plupload,现在我的脚本被忽略了。

有人能告诉我我哪里蠢了吗?谢谢!

解决了。 这是一个令人讨厌、丑陋的 hack,但它有效:

  • 隐藏 "actual" submit/upload 按钮
  • 制作了第二个按钮,作为具有 onclick 功能的预提交按钮
  • onclick 函数调用 checkReq,如果 returns 为真,则该函数调用 "actual" submit/upload 按钮的 click() 函数

就像我说的:讨厌但它有效。