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;
}
};
注意:未经测试,但概念正确。
我已经研究 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;
}
};
注意:未经测试,但概念正确。