-
Notifications
You must be signed in to change notification settings - Fork 186
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
关于fileAdded事件,返回false时的处理,以及分片优化方案的建议 #1
Comments
多谢反馈,关于 1 的 bug 已在 0.1.1 版本修复,关于 2,这种方式的确很赞,节省不少开销,作为下个版本功能增强 👍 |
已做了初步实现,,其中可改进的地方如下:
具体实现如下,enableOnceCheck默认为false(代码比较粗糙,有较多冗余的地方,望提出改正)。 在uploader.js145行,enableOnceCheck为false时,代码处理逻辑不变;为true时,则向后台发送get请求,返回文件对应的已上传最大分片编号(需要配合后台):
在uploader.js文件,uploadNextChunk函数221-234行间:enableOnceCheck为false时,处理逻辑不变;为true时,则从uoloaded+1的位置开始,直接发送POST请求上传文件,并且不再做GET验证请求。
非常感谢作者的开源,uploader上传插件很棒,正在您的基础上自己改进代码。 |
|
@xyhxyw 不是思路,看这里: Uploader/samples/Node.js/public/app.js Lines 6 to 15 in ab9f6c6
其实是通过判断 checkChunkUploadedByResponse 的返回值来决定一个文件中的哪些块是已经上传了的,至于说判断规则的话完全可以和后端约定,自定义,这里模拟的就是说后端返回了uploaded_chunks数组,数组项是已经上传成功的 chunkNumber 集合,然后判断当前 chunk 是否在这个集合中;如果在,那么说明这个块已经上传过了,如果不在,说明还没上传过,需要上传。 这里的这个判断其实不只是对 test 的场景有用,即使不是test的情况,也一样可以处理,因为 checkChunkUploadedByResponse 的处理实际是在一个块请求成功后(可以是test的get请求,也可以是post真正上传的请求)判断的。 关于第2点,利用 checkChunkUploadedByResponse 的话,服务端可以直接返回 [1, 3, 4] ,然后只需要真正上传 2 这个块就好了。 |
@xyhxyw 能否满足需求呢?如果可以的话,我就加下文档,然后发一个新的版本 |
@dolymood ,恩,可以满足的,思路本身是对的,可以添加文档。我周末做下测试,然后再回复你。 |
0.2.0 |
checkChunkUploadedByResponse这个功能有一处感觉不太合适,对于第一个chunk,尽管函数判断的过程中返回了false,在testChunk这个http请求的状态码为200的情况下,不会上传第一个chunk。比较理想的情况是,服务端返回未上传的分片编号,前端根据函数判断的返回值判断是否需要上传此分片,而不是再根据http请求的状态码来判断 |
有道理,这个可以在下个版本来根据返回值直接决定需不需要,而非采用状态码,但是是个breaking change,需要发个大版本。#38 |
嗯,期待下一个大版本 |
关于 1 的 bug 似乎还没有解决,我在用分段上传了一个名称为car的文件夹里面有7张图片的时候,上传完成后,我再此点上传同一个文件夹,这时文件夹里面的文件会继续加入到car这个文件夹里,没上传一个 chunk,就请求一次合并,虽然我判断了同名文件夹,然后return false,但是fileList继续加入7张图片,一共14张 |
1的bug仍然存在,如果是第一次上传返回false的文件,则不进入队列。但是如果队列中有文件,这时再上传返回false的文件,虽然不会上传, 但是会在文件列表中展示 |
我们看下 @lubanproj 可以帮忙一起看下 |
能否考虑加一个test url自定义,或者让 checkChunkUploadedByResponse 纯粹跳过不用考虑有无test 或者第一个块已经上传成功。(预检查独立出来)
—————————————————————————————————————————————— 20240428 更新。问题已解决,通过target 的 mode 区分开测试路径和上传路径就行。 |
请问有什么方案可以支持根据testChunk 返回参数allUploaded = true 直接文件上传成功而不是每个分片都判断是否存在呢,目前我看到的方案基本是通过每次testChunk获取skipUpload 判断当前分片是否上传或者通过返回的分片编码数组判断是否上传(如果根据这个有个问题会不会有个分块未上传呢因为使用的是(data.uploaded || []).indexOf(chunk.offset + 1) >= 0 chunk.offset 是+1的 |
1 监听fileAdded事件,如果返回false,文件未加入上传队列(uploader.files),但却加入了uploader.fileList中并在页面显示了出来。
期望:返回了flase,应该表示该文件不是用户需要的文件,不应该加入uploader.fileList。
uploader.js 133行,可修改为:
2:进行分片上传时,有时候并不需要每个分片都做一次testChunks。这样对于较大文件,会浪费很多次请求。
建议,可增加一个参数enableOnceCheck。
enableOnceCheck为true时,在文件加入上传队列时,请求一次后台(GET),获取当前文件已经上传的分片位置,并保存到_file对象中。
如_file.uploadeChunk = 10,开始上传时(uploadNextChunk),直接从第11个分片开始POST(并且此时不需要再做分片检测的GET请求)。这种方案对于大文件,可以节省大量的GET检测请求。
enableOnceCheck为false时,默认状态,依旧对每个分片进行GET检测。
The text was updated successfully, but these errors were encountered: