FileMultiUploadField的FileUploadFinishEvent事件中如何获取文件

当单个文件上传成功后会调用FileUploadFinishEvent事件,但是在这个事件里只有文件名,没给文件的UUID,这怎么用fileUploadingAPI获得文件呢?

每个文件上传完成后,FileMultiUploadField 会存储成功的文件 UUID 和文件名。通过 FileMultiUploadField.getUploadsMap() 可以获取 UUID 和文件名的 Map<UUID, String>,可以遍历找一下文件名对应的 UUID。

也就是说如果上传了两个文件名一样的文件,就凉了。。

一般而言,操作系统不会允许一个目录有两个同名文件吧,在多文件上传时,不能跨文件目录选取。

好的,但是我发现UploadField上有个tempFileId好像是文件的UUID,不知道能不能用他。但是这个是在多线程环境里,而这个属性则在控件上,不知道会不会有问题?

tempField这个属性是暂存每个文件的 UUID,在不同文件时,这个 ID 会变。前一个完成时如果下一个文件的 FD 创建好了,这个 ID就会变成下一个文件的 ID,我感觉是不一定对。

多线程环境是怎么多线程?MultipleFileUploadField 内部设计肯定不是线程安全的。但是 UI 界面中,inject 的组件是用组件 id inject,不同的上传按钮有不同的 id,不会串。

我是说FileUploadFinishEvent是在多线程环境里(每次进来线程都不一样),WebFileMultiUploadField的相关代码如下。FileMultiUploadField.getUploadsMap()获得的就是这个files,在FileUploadFinish事件里,如果直接取tempFileId如果有可能被冲掉,那FileMultiUploadField.getUploadsMap()也应该有一样的问题

···
impl.addSucceededListener(event -> {
files.put(tempFileId, event.getFileName());

        fireFileUploadFinish(event.getFileName(), event.getContentLength());
    });

但我发现线程好像是依次进入,虽然线程不是一个,但是不会并发。不知道这里到底会不会有多线程的问题?前端是传完一个文件再传一个文件,这样依次进行吗?

最后给个建议:
1、FileUploadFinishEvent上增加文件的UUID,方便处理文件,免得还要去反射;
2、所有文件开始上传之前给个开始事件,可以进行一些初始化操作;