Restricting file types upload component

廉价感情. 提交于 2019-12-05 18:30:35

No, its not the correct way. The fact is, Vaadin does provide many useful interfaces that you can use to monitor when the upload started, interrupted, finished or failed. Here is a list:

com.vaadin.ui.Upload.FailedListener;
com.vaadin.ui.Upload.FinishedListener;
com.vaadin.ui.Upload.ProgressListener;
com.vaadin.ui.Upload.Receiver;
com.vaadin.ui.Upload.StartedListener;

Here is a code snippet to give you an example:

@Override
public void uploadStarted(StartedEvent event) {
    // TODO Auto-generated method stub
    System.out.println("***Upload: uploadStarted()");

    String contentType = event.getMIMEType();
    boolean allowed = false;
    for(int i=0;i<allowedMimeTypes.size();i++){
        if(contentType.equalsIgnoreCase(allowedMimeTypes.get(i))){
            allowed = true;
            break;
        }
    }
    if(allowed){
        fileNameLabel.setValue(event.getFilename());
        progressBar.setValue(0f);
        progressBar.setVisible(true);
        cancelButton.setVisible(true);
        upload.setEnabled(false);
    }else{
        Notification.show("Error", "\nAllowed MIME: "+allowedMimeTypes, Type.ERROR_MESSAGE);
        upload.interruptUpload();
    }

}

Here, allowedMimeTypes is an array of mime-type strings.

ArrayList<String> allowedMimeTypes = new ArrayList<String>();
allowedMimeTypes.add("image/jpeg");
allowedMimeTypes.add("image/png");

I hope it helps you.

Can be done.

You can add this and it will work (all done by HTML 5 and most browsers now support accept attribute) - this is example for .csv files:

upload.setButtonCaption("Import");
JavaScript.getCurrent().execute("document.getElementsByClassName('gwt-FileUpload')[0].setAttribute('accept', '.csv')");

I think it's better to throw custom exception from Receiver's receiveUpload:

Upload upload = new Upload(null, new Upload.Receiver() {
    @Override
    public OutputStream receiveUpload(String filename, String mimeType) {
        boolean typeSupported = /* do your check*/;
        if (!typeSupported) {
            throw new UnsupportedImageTypeException();
        }
        // continue returning correct stream
    }
});

The exception is just a simple custom exception:

public class UnsupportedImageTypeException extends RuntimeException {
}

Then you just simply add a listener if the upload fails and check whether the reason is your exception:

upload.addFailedListener(new Upload.FailedListener() {
    @Override
    public void uploadFailed(Upload.FailedEvent event) {
        if (event.getReason() instanceof UnsupportedImageTypeException) {
            // do your stuff but probably don't log it as an error since it's not 'real' error
            // better would be to show sth like a notification to inform your user
        } else {
            LOGGER.error("Upload failed, source={}, component={}", event.getSource(), event.getComponent());
        }
    }
});

public static boolean checkFileType(String mimeTypeToCheck) { ArrayList allowedMimeTypes = new ArrayList();

    allowedMimeTypes.add("image/jpeg");
    allowedMimeTypes.add("application/pdf");
    allowedMimeTypes.add("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
    allowedMimeTypes.add("image/png");
    allowedMimeTypes.add("application/vnd.openxmlformats-officedocument.presentationml.presentation");
    allowedMimeTypes.add("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");

    for (int i = 0; i < allowedMimeTypes.size(); i++) {
        String temp = allowedMimeTypes.get(i);
        if (temp.equalsIgnoreCase(mimeTypeToCheck)) {
            return true;
        }
    }

    return false;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!