我尝试在上传文件之前进行实施比较。
如果系统中存在文件名称,请询问有关创建新版本的信息或仅覆盖它。
问题是如何获取文件名?
我无法使用receiveUpload(),因为此方法文件是从上传组件中删除的吗?
答案 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,您可以将其粘贴到用户界面并进行测试。