Fine Uploader S3 - 无处可安全调用异步 "setUploadSuccessParams()"

Fine Uploader S3 - Nowhere to safely call the asynchronous "setUploadSuccessParams()"

我已经研究 Fine Uploader S3 两个星期了,总的来说这是一个非常好的插件。

然而,我发现了一个问题,我仍然无法克服。我不确定这是插件限制还是我的愚蠢行为。

我需要使用这个方法。这是一种我可以设置一些自定义参数以在成功上传到 Amazon S3 后发送到我的服务器的方法:

var params = {
    file_storage: 's3',
    file_module: 'gallery',
    file_path: $gallery_upload.fineUploaderS3('getKey', id),
    file_name: name,
    file_type: $gallery_upload.fineUploader('getFile', id).type
};

$gallery_upload.fineUploader('setUploadSuccessParams', params, id);

有2个问题:

(1) 这是异步的,并且作为发出 "success" 消息的实际算法完全在单独的线程上运行。

(2) 根据不同的地方,"getKey"方法return未定义。这是可以理解的,但我想要 "one place" getKey() 将始终 return 我从 S3 获得的那个邪恶密钥。

============================================= ==============

最后我无处放置我的代码片段。我试过几个地方:

(A) 提交回调

.on('submitted', function(event, id, name){

没有。正如预期的那样,getKey 还没有准备好。


(B) "statusChange" 回调@newStatus == "upload successful".

.on('statusChange', function(event, id, oldStatus, newStatus){

这有时有效,有时无效。由于异步问题。此外,相当骇人听闻。看起来像这样。

.on('statusChange', function(event, id, oldStatus, newStatus){
    console.log('Event: statusChange', oldStatus, newStatus);

    if( newStatus === 'upload successful' )
    {
        var params = {
            file_storage: 's3',
            file_module: 'gallery',
            file_path: $gallery_upload.fineUploaderS3('getKey', id),
            file_name: name,
            file_type: $gallery_upload.fineUploader('getFile', id).type
        };
    }

})

(C) 仅进度回调 @ "uploadedBytes == totalBytes"

.on('progress', function(event, id, name, uploadedBytes, totalBytes){

仅当 uploadedBytes == totalBytes 时。但同样,由于异步的原因,这听起来很危险。它也很 hacky。


(D) 进度回调

.on('progress', function(event, id, name, uploadedBytes, totalBytes){

这似乎效果最好,但是,听起来非常老套。它向 setUploadSuccessParams() 发送垃圾邮件,所以真的很糟糕!我想知道是否有 "correct way" 可以做到这一点。例如,一些立即生效的 bang-on 事件。

每个文件的密钥尽可能晚地确定,目前刚好在上传之前。这发生在执行 onUpload 事件回调处理程序之后(这并不重要,因为 onUpload 不允许承诺 return 类型)。

因此,处理您的独特情况的最佳行动方案是覆盖 objectProperties.key 选项。该函数在调用时会生成一个键名,并使用它来设置该文件的上传成功参数。

例如:

objectProperties: {
    key: function(id) {
        var name = this.getName(id),
            key = this.getUuid(id) + '.' + qq.getExtension(name),
            params = {
                file_storage: 's3',
                file_module: 'gallery',
                file_path: key,
                file_name: name,
                file_type: this.getFile(id).type
            };

        this.setUploadSuccessParams(params, id);

        return key;
    }
};

注意:未经测试,但概念正确。