spring文件上传下载

spring文件上传

1、配置对上传文件大小的限制
<!-- 配置文件上传解析器 -->
<bean id="multipartResolver"
      class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="defaultEncoding" value="utf-8" />
    <!-- 设定限制的文件上传大小 单位是B:100*1024*1024=100MB -->
    <property name="maxUploadSize" value="104857600" />
    <property name="maxInMemorySize" value="40960" />
</bean>

当上传的文件大小大于配置的maxUploadSize大小时,spring会抛出MaxUploadSizeExceededException
异常,可以采用配置全局异常的方式,针对捕获到该异常做处理,代码如下:

@ControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 文件上传文件大小异常处理
     */
    @ExceptionHandler(value = MaxUploadSizeExceededException.class)
    @ResponseBody
    public Map jsonErrorHandler(MaxUploadSizeExceededException e) throws Exception {
        return ResultMessageUtils.resultMessageWithData(false,
                "上传失败:文件大小不能超过" + e.getMaxUploadSize() / 1024 / 1024 + "MB", null);
    }
}
2、spring文件上传
@RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
@ResponseBody
public Map uploadFile(HttpServletRequest request) {
    Map resMap = Maps.newHashMap();
    MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) (request);
    Iterator its = multiRequest.getFileNames();
    MultipartFile multipartFile = null;
    StringBuilder tempFileName;
    try {
        File file = new File(tempDir);
        while (its.hasNext()) {
            multipartFile = multiRequest.getFile(its.next());
            String name = multipartFile.getName();
            String originalFilename = multipartFile.getOriginalFilename();
            if (StringUtils.isEmpty(originalFilename))
                continue;
            tempFileName = new StringBuilder();
            tempFileName.append(tempDir).append("/").append(name)
                    .append("_").append(originalFilename);
            file = new File(tempFileName.toString());
            file.deleteOnExit();
            FileUtils.createDir(file);
            // 上传的文件写入到指定的文件中
            multipartFile.transferTo(file);
            tempFileName = null;
        }
        resMap.put(ResultMessageUtils.CODE, true);
        resMap.put(ResultMessageUtils.MSG, "文件上传成功");
    } catch (Exception e) {
        e.printStackTrace();
        log.error("文件上传失败:" + e);
        resMap.put(ResultMessageUtils.CODE, false);
        resMap.put(ResultMessageUtils.MSG, "文件上传失败");
        return resMap;
    }
    return resMap;
}
3、spring文件下载
private ResponseEntity downloadFile(String fileName, String filePrefix) {
    File file = new File(tempDir + "/" + fileName);
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.TEXT_HTML);
    if (!file.exists() || file.isDirectory()) {
        return new ResponseEntity(
                "alert('下载文件不存在');".getBytes(), headers,
                HttpStatus.CREATED);
    }
    try {
        if (StringUtils.isNotEmpty(filePrefix)) {
            fileName = fileName.substring(filePrefix.length() + 1);
        }
        fileName = new String(fileName.getBytes("UTF-8"), "iso-8859-1");
        headers.setContentDispositionFormData("attachment", fileName);
        return new ResponseEntity(
                FileUtils.readFileToByteArray(file), headers,
                HttpStatus.CREATED);
    } catch (Exception e) {
        e.printStackTrace();
        log.error("下载文件失败:" + e);
        return new ResponseEntity(
                "alert('文件下载失败');".getBytes(), headers,
                HttpStatus.CREATED);
    }
}
<think>嗯,用户问的是Spring文件上传下载,我需要详细介绍一下。首先,我应该回忆一下Spring框架中处理文件上传下载的相关模块。记得Spring MVC提供了对文件上传的支持,主要是通过MultipartResolver接口实现的。可能需要提到CommonsMultipartResolver和StandardServletMultipartResolver这两个实现类,分别对应不同的配置方式。 用户可能想知道具体的实现步骤,所以需要分步骤讲解。首先是文件上传部分,需要配置MultipartResolver,然后在Controller中处理上传请求,使用@RequestParam接收MultipartFile对象。同时,要说明如何保存文件到服务器,可能还需要处理文件名、路径以及异常情况,比如文件过大或者格式不支持。 然后是文件下载部分,这部分需要用到ResponseEntity或HttpServletResponse,将文件流写入响应中,并设置合适的HTTP头,比如Content-Disposition,让浏览器知道这是附件下载。可能需要提到如何动态获取文件路径,处理文件不存在的情况,避免服务器错误。 还需要考虑Spring Boot中的自动配置,可能更简单,因为Spring Boot默认配置了StandardServletMultipartResolver,只需要在application.properties中设置相关参数,比如最大文件大小和请求大小。这样用户在使用Spring Boot时会更方便。 另外,用户可能对前后端的交互感兴趣,比如前端表单需要设置enctype为multipart/form-data,否则上传会失败。可能需要给出一个简单的前端表单示例,帮助用户理解如何配合后端使用。 还要注意安全性问题,比如限制上传文件的类型、大小,防止恶意文件上传。同时,下载时防止路径遍历攻击,确保用户不能访问系统其他文件。这些都是实际开发中需要注意的点。 可能用户是刚开始学习Spring,所以需要语言通俗易懂,避免使用过多专业术语,或者如果用了术语,最好简单解释一下。例如,MultipartFile是什么,有什么方法,如getOriginalFilename(),transferTo()等。 有没有可能用户遇到的问题,比如配置不正确导致上传失败?这时候需要检查配置是否正确,比如是否启用了MultipartResolver,或者Spring Boot中的配置参数是否正确设置。 另外,可以给出完整的代码示例,比如Controller层的上传和下载方法,这样用户可以直接参考。同时,提到常用的依赖,比如Spring Web和Apache Commons FileUpload(如果是传统Spring MVC项目),或者Spring Boot Starter Web。 可能还需要比较传统Spring MVC和Spring Boot在配置上的不同,让用户根据项目类型选择合适的方式。比如,传统项目可能需要手动配置Bean,而Spring Boot自动配置了大部分内容。 最后,总结一下步骤,强调关键点,比如配置、接收文件对象、处理保存和下载响应,以及安全注意事项。这样用户能有一个清晰的流程概念,方便实践。</think>在Spring框架中,文件上传下载是Web开发的常见需求,主要通过Spring MVC模块实现。以下是分步说明: 一、文件上传实现 1. 配置MultipartResolver ```java // 传统Spring MVC配置(XML) <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="10485760"/> <!-- 10MB限制 --> </bean> // Spring Boot配置(application.properties) spring.servlet.multipart.max-file-size=10MB spring.servlet.multipart.max-request-size=10MB ``` 2. 编写Controller ```java @PostMapping("/upload") public String handleUpload(@RequestParam("file") MultipartFile file) { if (!file.isEmpty()) { try { // 获取原始文件名 String fileName = file.getOriginalFilename(); // 保存到指定路径 file.transferTo(new File("/upload/path/" + fileName)); return "上传成功"; } catch (IOException e) { return "上传失败:" + e.getMessage(); } } return "文件为空"; } ``` 二、文件下载实现 ```java @GetMapping("/download") public ResponseEntity<Resource> downloadFile(@RequestParam String filename) { // 获取文件路径 Path filePath = Paths.get("/upload/path/" + filename); Resource resource = new InputStreamResource(Files.newInputStream(filePath)); return ResponseEntity.ok() .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + filename + "\"") .contentType(MediaType.APPLICATION_OCTET_STREAM) .body(resource); } ``` 三、前端配合示例(HTML) ```html <!-- 上传表单 --> <form method="POST" enctype="multipart/form-data"> <input type="file" name="file" /> <button type="submit">上传</button> </form> <!-- 下载链接 --> <a href="/download?filename=test.txt">下载文件</a> ``` 四、注意事项 1. 安全防护 - 限制上传文件类型(通过文件名后缀检查) - 重命名存储文件(防止文件名冲突) - 设置合理的文件大小限制 - 对下载文件名进行合法性校验,防止路径遍历攻击 2. 异常处理 - 捕获`MultipartException`处理上传异常 - 处理`FileNotFoundException`等下载异常 3. 存储优化 - 大文件建议分块上传 - 分布式环境需使用对象存储(如OSS、S3) - 定期清理临时文件 Spring Boot简化了配置流程,推荐使用以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ``` 实际开发中,建议结合具体业务需求: - 添加文件元数据管理 - 实现进度条功能 - 集成云存储服务 - 增加权限校验等安全措施
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值