SpringBoot下文件上传与下载的实现

本文欢迎转载,转载请注明出处,谢谢~(作者:喝酒不骑马 Colton_Null)

from CSDN


SpringBoot后台如何实现文件上传下载?

最近做的一个项目涉及到文件上传与下载。前端上传采用百度webUploader插件。有关该插件的使用方法还在研究中,日后整理再记录。本文主要介绍SpringBoot后台对文件上传与下载的处理。

单文件上传

// 单文件上传
@RequestMapping(value = "/upload")
@ResponseBody
public String upload(@RequestParam("file") MultipartFile file) {
    try {
    if (file.isEmpty()) {
        return "文件为空";
    }
    // 获取文件名
    String fileName = file.getOriginalFilename();
    logger.info("上传的文件名为:" + fileName);
    // 获取文件的后缀名
    String suffixName = fileName.substring(fileName.lastIndexOf("."));
    logger.info("文件的后缀名为:" + suffixName);

    // 设置文件存储路径
    String filePath = "D://aim//";
    String path = filePath + fileName + suffixName;

    File dest = new File(path);
    // 检测是否存在目录
    if (!dest.getParentFile().exists()) {
        dest.getParentFile().mkdirs();// 新建文件夹
    }
    file.transferTo(dest);// 文件写入
    return "上传成功";
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return "上传失败";
}

如果想要修改文件路径及文件名,修改filePath以及fileName即可。

多文件上传

//多文件上传
@RequestMapping(value = "/uploadMore", method = RequestMethod.POST)
@ResponseBody
public String handleFileUpload(HttpServletRequest request) {
    List<MultipartFile> files = ((MultipartHttpServletRequest) request).getFiles("file");
    MultipartFile file = null;
    BufferedOutputStream stream = null;
    for (int i = 0; i < files.size(); ++i) {
        file = files.get(i);
        String filePath = "D://aim//";
        if (!file.isEmpty()) {
            try {
                byte[] bytes = file.getBytes();
                stream = new BufferedOutputStream(new FileOutputStream(
                        new File(filePath + file.getOriginalFilename())));//设置文件路径及名字
                stream.write(bytes);// 写入
                stream.close();
            } catch (Exception e) {
                stream = null;
                return "第 " + i + " 个文件上传失败  ==> "
                        + e.getMessage();
            }
        } else {
            return "第 " + i
                    + " 个文件上传失败因为文件为空";
        }
    }
    return "上传成功";
}

文件下载

//文件下载相关代码
@RequestMapping("/download")
public String downloadFile(HttpServletRequest request, HttpServletResponse response) {
    String fileName = "aim_test.txt";// 设置文件名,根据业务需要替换成要下载的文件名
    if (fileName != null) {
        //设置文件路径
        String realPath = "D://aim//"
        File file = new File(realPath , fileName);
        if (file.exists()) {
            response.setContentType("application/force-download");// 设置强制下载不打开
            response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);// 设置文件名
            byte[] buffer = new byte[1024];
            FileInputStream fis = null;
            BufferedInputStream bis = null;
            try {
                fis = new FileInputStream(file);
                bis = new BufferedInputStream(fis);
                OutputStream os = response.getOutputStream();
                int i = bis.read(buffer);
                while (i != -1) {
                    os.write(buffer, 0, i);
                    i = bis.read(buffer);
                }
                System.out.println("success");
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (bis != null) {
                    try {
                        bis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (fis != null) {
                    try {
                        fis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    return null;
}

MultipartConfig配置

可以通过MultipartConfig配置类对文件上传进行全局控制。

@Configuration
public class MultipartConfig {

    @Bean
    public MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        // 置文件大小限制 ,超出此大小页面会抛出异常信息
        factory.setMaxFileSize("2MB"); //KB,MB
        // 设置总上传数据总大小
        factory.setMaxRequestSize("20MB");
        // 设置文件临时文件夹路径
        // factory.setLocation("E://test//");
        // 如果文件大于这个值,将以文件的形式存储,如果小于这个值文件将存储在内存中,默认为0
        // factory.setMaxRequestSize(0);
        return factory.createMultipartConfig();
    }
}

注意事项

前后端文件传输格式应为 multipart/form-data

  • 6
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
### 回答1: Spring Boot可以通过MultipartFile来实现文件下载文件: 1. 在Controller中添加一个方法,使用@RequestParam注解来接收上文件。 ``` @PostMapping("/upload") public String uploadFile(@RequestParam("file") MultipartFile file) { // 处理上文件 return "上成功"; } ``` 2. 在前端页面中添加一个表单,使用enctype="multipart/form-data"来指定表单类型为文件。 ``` <form method="post" action="/upload" enctype="multipart/form-data"> <input type="file" name="file" /> <button type="submit">上</button> </form> ``` 文件下载: 1. 在Controller中添加一个方法,使用@PathVariable注解来接收文件名,使用ResponseEntity来返回文件。 ``` @GetMapping("/download/{fileName:.+}") public ResponseEntity<Resource> downloadFile(@PathVariable String fileName) { // 获取文件路径 Path filePath = Paths.get("文件路径", fileName); Resource resource = new UrlResource(filePath.toUri()); // 设置响应头 HttpHeaders headers = new HttpHeaders(); headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + fileName); headers.add(HttpHeaders.CONTENT_TYPE, "application/octet-stream"); // 返回文件 return ResponseEntity.ok() .headers(headers) .contentLength(resource.contentLength()) .body(resource); } ``` 2. 在前端页面中添加一个链接,指向下载文件的URL。 ``` <a href="/download/文件名">下载</a> ``` ### 回答2: Spring Boot是一个用于构建web应用程序和微服务的框架。它提供了一种简单而强大的方式来实现文件下载的功能。在本文中,我们将讨论如何实现Spring Boot中的这些功能。 文件: 在Spring Boot中,可以使用MultipartFile对象来处理文件。MultipartFile是Spring提供的一个接口,可以用来获取用户上文件信息。首先,我们需要在Controller中定义一个POST方法来处理文件的请求。在方法中,需要使用@RequestParam注解来获取文件参数,并使用MultipartFile对象来接收文件参数。然后,我们可以使用File类或其他文件处理类来将文件保存到磁盘上。 以下是一个简单的文件示例: ``` @PostMapping("/upload") public String uploadFile(@RequestParam("file") MultipartFile file) throws IOException { // 将文件保存到磁盘上 String fileName = file.getOriginalFilename(); File dest = new File("/path/to/save/" + fileName); file.transferTo(dest); return "File uploaded successfully"; } ``` 文件下载文件下载就是让服务器把指定的文件发送给客户端。为了实现文件下载,我们需要在Controller中定义一个GET请求处理方法,并使用ResponseEntity对象来封装文件输出流。ResponseEntity是Spring提供的一个用于表示HTTP响应的对象,其中包含了HTTP响应的各种元数据和响应体。 以下是一个简单的文件下载示例: ``` @GetMapping("/download") public ResponseEntity<byte[]> downloadFile() throws IOException { // 读取要下载文件 File file = new File("/path/to/file"); byte[] bytes = FileUtils.readFileToByteArray(file); // 设置响应头 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); headers.setContentDispositionFormData("attachment", file.getName()); headers.setContentLength(bytes.length); // 构造响应实体 ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, headers, HttpStatus.OK); return responseEntity; } ``` 在该示例中,我们使用FileUtils类从磁盘上读取文件,并将文件内容封装到一个字节数组中。然后,我们设置响应头的Content-Type和Content-Disposition字段,以告诉浏览器下载文件。最后,我们构造一个ResponseEntity对象来封装响应实体,并返回此对象。当浏览器收到此响应后,就会弹出下载框,用户可以选择保存文件到本地磁盘上。 综上所述,Spring Boot提供了一种简单而强大的方式来实现文件下载的功能。我们只需要定义一些Controller方法,并使用Spring提供的MultipartFile和ResponseEntity对象来处理文件即可。 ### 回答3: Spring Boot是一个快捷开发框架,让Java开发者更快地构建Web应用程序。在本文中,我们将探讨Spring Boot如何实现文件下载的功能。 文件 文件是指将文件从客户端上到Web服务器。Spring Boot提供了多种方式来处理文件,其中最受欢迎的是使用MultipartFile接口。以下是如何在Spring Boot中实现文件的步骤: 1. 确保你添加了以下依赖项: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ``` 2. 在Controller类中创建以下方法: ``` @PostMapping("/upload") public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) { String fileName = StringUtils.cleanPath(file.getOriginalFilename()); //处理响应信息 } ``` 3. 将该方法映射到一个REST终端点,以便可以从客户端对其进行调用。在上面的示例中,该方法被映射到/upload地址。 4. 使用MultipartFile接口从request中获取上文件的数据并保存在文件系统中。 5. 处理响应信息,并返回响应给客户端。 文件下载 文件下载是指将文件从Web服务器下载到客户端。以下是如何在Spring Boot中实现文件下载的步骤: 1. 确保你添加了以下依赖项: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ``` 2. 在Controller类中创建以下方法: ``` @GetMapping("/download/{fileName:.+}") public ResponseEntity<InputStreamResource> downloadFile(@PathVariable String fileName) throws IOException { //使用文件名创建文件对象 //处理响应信息 } ``` 3. 将该方法映射到一个REST终端点,以便可以从客户端对其进行调用。在上面的示例中,该方法被映射到/download/{fileName:.+}地址,其中fileNme参数是文件名。 4. 使用文件名创建文件对象。 5. 将文件对象的输入流包装为InputStreamResource。 6. 处理响应信息,并将文件作为附件返回给客户端。 在实现文件下载时,确保新建一个文件夹存储上文件。这样可以避免混淆和错误,而且可以定期删除旧文件以节省磁盘空间。 通过实现文件下载的Spring Boot应用程序,你可以向你的应用程序添加强大的功能,从而更好地满足你的业务需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值