【问题标题】:JavaFX FileChooser exclude extensionsJavaFX FileChooser 排除扩展
【发布时间】:2014-12-12 03:48:53
【问题描述】:

我使用 JavaFX 制作了一个上传应用程序。 (在这种情况下,我使用 JavaFX 8)

我希望应用程序能够上传几乎任何文件(音频文件、媒体文件、pdf、zip、7z 等)。但我不能让用户上传恶意文件或有害脚本到我的服务器(应该禁止.exe、.php、.sh)。

问题是,在 JavaFX FileChooser 中,我看不到任何允许我排除某些扩展的方法。我不想向 FileChooser 添加广泛的扩展过滤器,而是想排除 FileChooser 的一些扩展。

下面是一些示例代码:

    fc = new FileChooser();
    fc.getExtensionFilters().addAll(
        new FileChooser.ExtensionFilter("Audio files", /* some audio files extension*/),
        new FileChooser.ExtensionFilter("Video files", /* some video files extension*/),
        new FileChooser.ExtensionFilter("eBook files", /* some eBook files extension*/),
        // I want to include all media files, but exclude some extensions here
        new FileChooser.ExtensionFilter("All files", "*.*")
    );

有什么方法可以在文件选择器中排除扩展名?

【问题讨论】:

    标签: javafx javafx-8 file-extension filechooser


    【解决方案1】:

    对于 FileChooser,不可能排除可以使用 JFileChooser 的扩展...

    您可以使用为 JFileChooser 而不是 FileChooser 扩展 FileFilter 的此类:

    我使用来自 Apache Commons IO 的 FilenameUtils.getExtension

     public class ReverseFileNameExtensionFilter extends FileFilter {
    
        private String [] fileextensions;
        private String description="";
    
         public ReverseFileNameExtensionFilter(String description, String... fileextension){
             this.fileextensions=fileextension;
             this.description = description;
         }
    
         @Override
         public String getDescription(){
           return description;
         }
    
         public String[] getExtensions(){
           return fileextensions;
         }
    
         @Override
         public boolean accept(File f){
             String [] extensions=this.getExtensions();
             String extfile = FilenameUtils.getExtension(f.getAbsolutePath());
             for (int t=0;t<extensions.length;t++){
                 if (extfile.equals(extensions[t])){
                     return false;
                 }  
             }
             return true;
         }
    
     }
    

    使用示例:

     FileFilter filter = new ReverseFileNameExtensionFilter("File that you don't want", "exe", "dll");
     JFileChooser fileChooser = ...;
     fileChooser.addChoosableFileFilter(filter);
    

    如果您不想使用 Apache Commons IO,可以将此函数添加到类 ReverseFileNameExtensionFilter:

    private String getFileExtension(File file) {
        String name = file.getName();
        int lastIndexOf = name.lastIndexOf(".");
        if (lastIndexOf == -1) {
            return ""; // empty extension
        }
        return name.substring(lastIndexOf+1);
    }
    

    并改变这行函数accept(File f):

    String extfile = FilenameUtils.getExtension(f.getAbsolutePath());
    

    用这个:

    String extfile = getFileExtension(f);
    

    【讨论】:

    • 它不工作。 FileNameExtensionFilter 是最终的,无法扩展。
    • 是的,我将类扩展的代码更改为 FileFilter ...对不起
    猜你喜欢
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 2019-02-27
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多