文件下载时,文件名为中文和含有特殊字符的综合解决方案

文件下载时,文件名为中文和含有特殊字符的综合解决方案

先来分析这个问题:

  1. 文件名中含有特殊字符
  2. 文件名含有中文

文件名中含有特殊字符

分析:

  1. 含有英文逗号,导致下载链接失效
  2. 含有特殊符号(< > / \ | : * ? 等),导致下载到本地后无法创建文件

含有英文逗号,导致下载链接失效

解决:

  1. 给文件名进行encode编码
URLEncoder.encode(fileName, Charsets.UTF_8.name())
  1. 含有特殊符号(< > / \ | : * ? 等),导致下载到本地后无法创建文件
    不同操作系统有不同的区别:

    1. window系统:
  2. windows中,文件名(包括扩展名)可高达 255 个字符。文件名可以包含除 ? / \ < > * | :
    之外的大多数字符;保留文件名的大小写;文件名不区分大小写(由 POSIX 应用程序使用时除外)。
    windows系统下文件名长度为:255个英文字符(DOS下8.3格式),包括文件名和扩展名在内,
    或者是255/2=127个中文字符+1个英文字符。

  3. 具体如下:
    允许文件或者文件夹名称不得超过255个字符。
    文件名除了开头之外任何地方都可以使用空格。
    文件名中不能有下列符号:“?”、“、”、“/”、“╲”、“*”、“<”、“>”、“|”。
    Windows文件名不区分大小写,但在显示时可以保留大小写格式。
    文件名中可以包含多个间隔符,如“我的文件。我的图片。001”。

  4. Mac系统:

    文件名中不能含有 ” : “字符,另外,文件名不能以 ‘.’ 字符开头,大小写敏感。

  5. Linux系统:

    允许使用除了 ‘/’ 以外 所有的特殊字符,但是不建议用户这么做。最好文件名中不要包含 : ? @ # $&()|; ‘’“”<>等字符,另外 空格符,制表符和退格符也不建议使用。

    避免使用 + – 和. 作为文件名的第一个字符(Linux下以.开头的文件是隐藏文件) 。 大小写敏感。

具体解决方案:

/**
     * window操作系统文件名不能含有 ? “ ”/ \ < > * | :
     * mac操作系统文件名不能以.开头
     * linux和Mac基本一直,
     * 
     * @param fileName
     * @return
     */
    public String checkFileName(String fileName) {
        Pattern pattern = Pattern.compile("[\\s\\\\/:\\*\\?\\\"<>\\|.]");
        Matcher matcher = pattern.matcher(fileName);
        fileName = matcher.replaceAll(""); // 将匹配到的非法字符以空替换
        return fileName;
    }
    原文作者:weixin_42834380
    原文地址: https://blog.csdn.net/weixin_42834380/article/details/103633387
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞