Java - 以编程方式检查文件名中的无效字符

标签 java file

最近,我们有人上传了一个文件名称中包含非法字符(双连字符),导致无法重新下载该文件。在本例中,文件名是
一些名字——一些其他信息

对于上传,通过获取原始文件名来设置文件名,这是一个业务规则。

file.setFileName(file.getFile().getOriginalFilename());

这导致双连字符变成两个颠倒的问号,并且出于某种原因导致无法从服务器检索文件。

我想知道是否有一个编程解决方案来检查此类情况的原始文件名。

为了透明起见,以下是上传文件的代码:

 public void saveOpcertCeuFile(OpcertCeuFileUpload file) {
        UmdContact user = secUtilService.getActiveUser();
        String username = user.getEmail();
        Date now = new Date();

        file.setCreatedTs(now);
        file.setLastUpdatedTs(now);
        file.setCreatedBy(username);
        file.setLastUpdatedBy(username);
        file.setFileName(file.getFile().getOriginalFilename());
        file.setIsApproved(Boolean.FALSE);
        file.setIsDeleted(Boolean.FALSE);

        try {
            file.setByteContents(file.getFile().getBytes());
        } catch (Exception ex) {
            log.info(ex);
            throw new RuntimeException(ex);
        }
        dao.insertOpcertCeuFileUpload(file);

        Path path = this.getOptcertCeuFilePath(file);
        String configF = envService.getServerUrl();
        file.setFilePath(String.valueOf(path));
        dao.updateOpcertCeuFilePath(file);

        try {
            File file1 = path.toFile();
            file1.getParentFile().mkdirs();
            Files.write(path, file.getByteContents(), StandardOpenOption.CREATE_NEW);
        } catch (Exception ex) {
            throw new RuntimeException(ex);
        }
    }

最佳答案

你的文件系统,你的规则

如果您想存储文件,请根据您想要的任何规则命名它们,但不要让用户指定名称。会不会有名字冲突?文件名是否包含无效字符?你永远不知道。

因此请使用您自己的命名约定。但你说有一些业务规则迫使你保留原始文件名。因此,只需在另一个地方执行此操作即可。

例如,您获取文件 Hello--World.txt,在文件系统上使用名称 20201124-000001.uploaded,然后存储在一些元数据中文件名是Hello--World.txt。当有人想要下载该文件名时,只需提供原始文件名作为下载即可。这样,您既可以保留与文件名关联的元数据,又可以保证系统的安全。

代码中的示例:

// Name on filesystem.
file.setFileName(date + "-" + orderingNumberForDate(date) + ".uploaded");     

// Name in the metadata (text or db)
file.setOriginalFileName(file.getFile().getOriginalFilename()); 

关于Java - 以编程方式检查文件名中的无效字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64989953/

相关文章:

file - 通过 ODATA 传输文件

linux - 如何防止mmap()-使文件对我的程序可见后对基础文件的更改?

java - SpringMVC 与 FreeMarker 集成

java - hibernate 错误 : executeQuery method cannot be used for update

java - IceTea/JDK/JRE 的 PyLucene 错误

java - 使用 RandomAccessFile 在 Java 中清除文件内容

java - 在项目根文件夹中找不到文件

java - Java 运行时异常和算术异常

java - 如何从一个文件输入文本并输出到另一个文件

file - 将文件名中具有特定字符串的目录中的所有文件复制到 Bash 中的不同目录