限制文件类型上传组件

Posted

技术标签:

【中文标题】限制文件类型上传组件【英文标题】: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;

这是正确的方法吗?

【问题讨论】:

【参考方案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 是我创建的处理上传过程的类。如果您需要查看实施,请告诉我。

【讨论】:

以上是关于限制文件类型上传组件的主要内容,如果未能解决你的问题,请参考以下文章

el-upload上传时的文件类型和大小限制失效,如何处理?

iview实现文件上传 限制上传格式大小

elementUI+el-upload 上传文件大小与文件类型校验

上传文件类型限制?

Java web文件上传怎么限制文件类型

在 JQuery 文件上传演示中限制文件类型