2014-03-26 75 views
1

我試着在文件上傳前比較這些文件。Vaadin上傳組件如何在submitUpload之前獲取fileName?

如果系統中存在名稱存在的文件,請詢問有關創建新版本或僅覆蓋它的信息。

這裏是問題,如何獲取文件名?

我不能使用receiveUpload(),因爲在這個方法文件被從上傳組件中刪除?

+0

嘗試查看此[限制文件類型](http://stackoverflow.com/questions/21913526/restricting-file-types-upload-component) – Skizzo

回答

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您可以粘貼到你的用戶界面,並對其進行測試。

相關問題