当前位置: 首页 > 知识库问答 >
问题:

Vaadin上传组件如何在提交上传之前获取文件名?

滕学义
2023-03-14

问题来了,如何获取文件名?

我不能使用receiveUpload(),因为从upload组件中删除此方法文件后?

共有1个答案

夔修伟
2023-03-14

问题是,一旦您使用upload组件启动上载,就只能通过调用interruptUpload()方法来中断它,并且以后任何时候都不能恢复。这种中断是永久性的。

这意味着您不能在上传过程中暂停查看系统中是否已经有该文件。你得一路上传文件。

考虑到这个缺点,你可以在系统中检查如果你有文件,在上传完成后。如果您拥有该文件,您可以显示一个确认对话框,在该对话框中您可以决定是保留该文件还是覆盖该文件。

public class RestrictingUpload extends Upload implements Upload.SucceededListener, Upload.Receiver {

private List<String> uploadedFilenames;
private ByteArrayOutputStream latestUploadedOutputStream;

public RestrictingUpload() {
    setCaption("Upload");
    setButtonCaption("Upload file");
    addSucceededListener(this);
    setReceiver(this);
    uploadedFilenames = new ArrayList<String>();
}

@Override
public OutputStream receiveUpload(String filename, String mimeType) {
    latestUploadedOutputStream = new ByteArrayOutputStream();
    return latestUploadedOutputStream;
}

@Override
public void uploadSucceeded(SucceededEvent event) {
    if (fileExistsInSystem(event.getFilename())) {
        confirmOverwrite(event.getFilename());
    } else {
        uploadedFilenames.add(event.getFilename());
    }
}

private void confirmOverwrite(final String filename) {
    ConfirmDialog confirmDialog = new ConfirmDialog();
    String message = String.format("The file %s already exists in the system. Overwrite?", filename);
    confirmDialog.show(getUI(), "Overwrite?", message, "Overwrite", "Cancel", new ConfirmDialog.Listener() {
        @Override
        public void onClose(ConfirmDialog dialog) {
            if (dialog.isConfirmed()) {
                copyFileToSystem(filename);
            }
        }
    });
}

private void copyFileToSystem(String filename) {
    try {
        IOUtils.write(latestUploadedOutputStream.toByteArray(), new FileOutputStream(filename));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e2) {
        e2.printStackTrace();
    }
}

private boolean fileExistsInSystem(String filename) {
    return uploadedFilenames.contains(filename);
}

注意,我使用了2个外部库:

  • 用于写入流的Apache Commons IO 2.4(http://mvnrepository.com/artifact/commons-io/commons-io/2.4)
  • 来自Vaadin目录的确认对话框(https://Vaadin.com/Directory#addon/confirmdialog)

您可以从gist:https://gist.github.com/gabrielRuiu/9960772获取该类的代码片段,您可以将其粘贴到UI中并测试它。

 类似资料:
  • 问题内容: 我在这里尝试取消文件上传时遇到了一些情况。我所做的事情是说,如果用户单击“取消”按钮,则它将仅删除iframe,这样它就不会进入将文件上传到服务器并将数据插入数据库的页面。 现在,如果用户快速单击“取消”按钮,则可以正常工作,但我意识到的问题是,如果用户单击时间很晚,则有时无法及时删除iframe该文件刚刚在用户点击“取消”按钮之前上传。 因此,我的问题是,如果用户在单击“取消”按钮之

  • swoole提供了文件上传模块,可以自动处理来自HTTP POST的文件上传。在Controller中调用 $this->upload->save('Upfile_key'); //需要生成缩略图 $this->upload->thumb_width = 136; //缩略图宽度 $this->upload->thumb_height = 136; //缩略图高度 $this->upload->t

  • 问题内容: 我意识到这个问题的变体已经出现了很多次,但是我找不到在这种情况下能回答这个问题的人。 我正在使用第三方fileuploader,该文件利用jQuery并在文件上传完成时给出成功回调。 我要实现的是一个带有文本字段的表单以及fileuploader,当您单击“提交”时,该表单将触发上传功能(文件开始使用进度条开始上传),并等待成功回调之前继续提交表格。 我必须立即承认我是jQuery的白

  • 问题内容: 我仍在努力寻找解决方案。 我可以让用户使用文件输入来选择文件(甚至多个): 我可以使用捕获事件。但是一旦完成,如何使用发送文件? 问题答案: 这是带有注释的基本示例。该功能是您要寻找的:

  • 我仍在努力想办法解决这个问题。 我可以让用户使用文件输入选择文件(甚至多个): 我可以使用

  • 我正在尝试使用多部分实体方法上传文件。但它失败,错误说{“错误”:“文件参数值'无'无效”} 我的代码是: File File = new File(" C:/Users/SST-06/Desktop/new . txt "); 我的实体文件包含所有提到的参数。 -hkYO-pblk 0 uqlxjtvklrbkosxz 7 mye-8 wbvbvanx Content-Disposition:f