【问题标题】:Restricting file types upload component限制文件类型上传组件
【发布时间】:2014-03-21 17:36:30
【问题描述】:

我正在使用vaadin(7.1.9)的上传组件,现在我的问题是我无法限制可以使用上传组件发送到服务器的文件类型,但我没有' t 找到任何用于此目的的 API。唯一的办法是上传后丢弃错误类型的文件。

public OutputStream receiveUpload(String filename, String mimeType) {

    if(!checkIfAValidType(filename)){
        upload.interruptUpload();
    }          

    return out;
}

这是正确的方法吗?

【问题讨论】:

    标签: java vaadin vaadin7


    【解决方案1】:

    不,这不是正确的方法。事实上,Vaadin 确实提供了许多有用的接口,您可以使用这些接口来监控上传何时开始、中断、完成或失败。这是一个列表:

    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;
    

    这里有一段代码sn-p给你举个例子:

    @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();
        }
    
    }
    

    这里,allowedMimeTypes 是一个 mime 类型字符串数组。

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

    希望对你有帮助。

    【讨论】:

    • 感谢您的回答,但我认为 MimeType 可能会因浏览器而异
    • 据我所知,MIMEType 是基于标准且独立于浏览器的,尽管 Microsoft IE 在处理 JavaScript 方面可能存在问题(毕竟 Vaadin 客户端引擎都是 JavaScript)。请参考此链接:en.wikipedia.org/wiki/Internet_media_type
    • 我的问题是,即使我在uploadStarted(...) 中调用upload.interruptUpload(),我的上传也会首先调用receiveUpload(...)。它将在那里创建一个 FileOutputStream 并在我的 tmp 文件夹中创建一个文件...
    【解决方案2】:

    可以。

    您可以添加它,它会起作用(全部由 HTML 5 完成,现在大多数浏览器都支持接受属性) - 这是 .csv 文件的示例:

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

    【讨论】:

    • 超级完美!
    【解决方案3】:

    我认为最好从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
        }
    });
    

    异常只是一个简单的自定义异常:

    public class UnsupportedImageTypeException extends RuntimeException {
    }
    

    如果上传失败,你只需添加一个监听器,并检查原因是否是你的异常:

    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());
            }
        }
    });
    

    【讨论】:

      【解决方案4】:

      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;
      }
      

      【讨论】:

      • 代码块的第一行需要缩进才能正确格式化。我无法自己编辑它,因为编辑需要更改的字符少于 6 个。
      • 你还应该考虑在你的代码中添加一个简短的描述来解释它的作用。
      【解决方案5】:

      我正在使用 Vaadin 8,上传类没有变化。

      FileUploader receiver = new FileUploader();
      Upload upload = new Upload();
      upload.setAcceptMimeTypes("application/json");
      upload.setButtonCaption("Open");
      upload.setReceiver(receiver);
      upload.addSucceededListener(receiver);
      

      FileUploader 是我创建的处理上传过程的类。如果您需要查看实施,请告诉我。

      【讨论】:

        猜你喜欢
        • 2010-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-11
        • 1970-01-01
        • 1970-01-01
        • 2019-12-21
        • 2016-11-10
        相关资源
        最近更新 更多