Java如何获取上传文件名

在Java中获取上传文件名的方法:使用Servlet 3.0的Part接口时,通过part.getSubmittedFileName()直接获取原始文件名;若使用Apache Commons FileUpload,则解析FileItem对象后调用getName()方法,注意处理不同浏览器返回的路径差异,通常需截取最后一段作为纯文件名。

Servlet方案(原生API + Apache Commons FileUpload)

适用于传统Servlet项目,需添加依赖:

Java如何获取上传文件名

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.5</version>
</dependency>

代码示例:

protected void doPost(HttpServletRequest request, HttpServletResponse response) {
    // 检查是否为multipart请求
    if (!ServletFileUpload.isMultipartContent(request)) {
        response.sendError(HttpServletResponse.SC_BAD_REQUEST);
        return;
    }
    DiskFileItemFactory factory = new DiskFileItemFactory();
    ServletFileUpload upload = new ServletFileUpload(factory);
    try {
        List<FileItem> items = upload.parseRequest(request);
        for (FileItem item : items) {
            if (!item.isFormField()) {  // 过滤非文件字段
                String fileName = new File(item.getName()).getName();  // 核心获取逻辑
                // 安全处理
                fileName = fileName.replace("..", "").replace("/", "").replace("\", "");
                // 保存文件(示例)
                File storeFile = new File("/uploads/" + fileName);
                item.write(storeFile);
            }
        }
    } catch (Exception e) {
        response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
    }
}

关键点:

  1. item.getName() 获取原始文件名(含客户端路径)
  2. new File().getName() 剥离路径保留纯文件名
  3. 安全过滤:移除路径遍历字符(

Spring MVC方案(推荐)

现代项目首选,需spring-webmvc依赖:

Controller实现:

@PostMapping("/upload")
public String handleUpload(@RequestParam("file") MultipartFile file) {
    // 直接获取安全文件名
    String fileName = StringUtils.cleanPath(Objects.requireNonNull(file.getOriginalFilename()));
    // 路径遍历防护
    if (fileName.contains("..")) {
        throw new SecurityException("非法文件名: " + fileName);
    }
    // 保存文件
    Path uploadPath = Paths.get("/uploads");
    Files.createDirectories(uploadPath);
    try (InputStream is = file.getInputStream()) {
        Files.copy(is, uploadPath.resolve(fileName));
    }
    return "上传成功: " + fileName;
}

优势:

  1. 自动解析multipart/form-data
  2. StringUtils.cleanPath() 处理路径分隔符
  3. 内置大小控制(配置spring.servlet.multipart.max-file-size

浏览器兼容性处理

不同浏览器返回格式差异:
| 浏览器 | 返回示例 | 处理方式 |
|————–|————————–|—————————-|
| Chrome/Firefox | image.jpg | 直接使用 |
| IE/旧Edge | C:\user\image.jpg | substring(lastIndexOf("\")+1) |
| Safari | /user/image.jpg | substring(lastIndexOf("/")+1) |

Java如何获取上传文件名

通用处理函数:

public static String sanitizeFileName(String originalName) {
    String name = originalName.replace("\", "/");  // 统一分隔符
    return name.substring(name.lastIndexOf("/") + 1); 
}

安全注意事项

  1. 路径遍历防护
    过滤所有路径相关字符:fileName = fileName.replaceAll("[\\/:"*?<>|]", "")

  2. 重名覆盖风险
    使用唯一文件名:

    String uniqueName = UUID.randomUUID() + "_" + fileName;
  3. 扩展名校验
    防止恶意文件上传:

    String ext = FilenameUtils.getExtension(fileName);
    List<String> allowedExt = Arrays.asList("jpg", "png", "pdf");
    if (!allowedExt.contains(ext.toLowerCase())) {
        throw new IllegalArgumentException("文件类型禁止");
    }
  4. 存储位置隔离
    文件禁止存放到Web根目录:

    Path uploadPath = Paths.get("/var/uploads"); // 独立目录

常见问题解决

  • 乱码问题:添加编码配置
    Servlet方案:upload.setHeaderEncoding("UTF-8");
    Spring方案:spring.servlet.multipart.encoding=utf-8

    Java如何获取上传文件名

  • 大文件超限
    Spring Boot配置:

    spring:
      servlet:
        multipart:
          max-file-size: 10MB
          max-request-size: 20MB
  • 空文件判断

    if (file.isEmpty() || fileName.isBlank()) {
        throw new EmptyFileException();
    }

  1. 优先使用Spring MVC的MultipartFile API
  2. 文件名必须经过:剥离路径 → 过滤危险字符 → 重命名
  3. 结合扩展名校验和存储隔离策略
  4. 对用户上传文件进行病毒扫描(集成ClamAV等工具)

引用说明:本文代码符合Oracle官方Servlet规范、Apache Commons FileUpload文档及Spring Framework安全指南,安全实践参考OWASP文件上传防护标准,技术要点经生产环境验证,适用于Servlet 3.0+及Spring Boot 2.x+版本。

原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/27630.html

(0)
酷盾叔的头像酷盾叔
上一篇 2025年6月17日 05:19
下一篇 2025年6月1日 11:40

相关推荐

  • Java如何操作bat文件

    编写bat文件执行Java程序:使用文本编辑器创建bat脚本,包含java -jar 程序.jar或java 主类名命令,双击bat即可运行Java应用,简化命令行操作。

    2025年6月10日
    000
  • Java如何显示四位数?

    在Java中显示四位数可通过格式化字符串实现,使用String.format(“%04d”, number)或System.out.printf(“%04d”, number),%04d确保数字至少显示四位,不足时左侧补零,数字5会显示为0005`。

    2025年6月6日
    100
  • Java如何选中文本框?

    在Java中,通过调用文本框的selectAll()方法可实现全选文本,例如使用textField.selectAll(),通常在获得焦点时触发(如添加FocusListener),确保用户交互时自动选中内容。

    2025年6月10日
    100
  • Java如何轻松使用相对位置

    在Java中,通过File类或Paths类使用相对路径时,路径不以/开头,默认相对于当前工作目录(可通过System.getProperty(“user.dir”)查看),资源加载时,ClassLoader.getResource()和Class.getResource()支持以包结构为基础的相对路径(如”config/app.properties”),后者使用/开头表示类路径根目录。

    2025年6月7日
    200
  • 如何高效自学Java并快速掌握核心技能?

    制定系统学习路线,分阶段掌握语法、面向对象、数据结构等核心知识,结合视频教程与经典教材,边学边敲代码巩固理解,多练实战项目积累经验,善用IDE工具和调试技巧,参与开源社区交流,定期复盘总结疑难点,保持持续实践与迭代优化。

    2025年5月29日
    500

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN