Vaadin上传组件如何在submitUpload之前获取fileName?

时间:2014-03-26 15:14:25

标签: java file-upload vaadin

我尝试在上传文件之前进行实施比较。

如果系统中存在文件名称,请询问有关创建新版本的信息或仅覆盖它。

问题是如何获取文件名?

我无法使用receiveUpload(),因为此方法文件是从上传组件中删除的吗?

1 个答案:

答案 0 :(得分:0)

问题是,一旦使用“上传”组件开始上传,只能通过调用 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个外部库:

您可以从Gist获取此类的代码段:https://gist.github.com/gabrielruiu/9960772,您可以将其粘贴到用户界面并进行测试。