SpringBoot实现文件的上传与下载

配置文件

# 文件保存路径,结尾必须有,不然目录不存在时生成的文件目录少一级
file.profile=F:/ruoyi/uploadPath/

上传单个文件

// 从配置文件获取要上传的目标文件路径
@Value("${file.profile}")
private String filePath;
​
private static final Logger log = LoggerFactory.getLogger(FileController.class);
​
// 单个文件上传
@RequestMapping(value = "/upload")
public String upload(@RequestParam("file") MultipartFile file) {
    try {
        if (file.isEmpty()) {
            return "上传失败,文件为空";
        }
        // 获取文件名
        String fileName = file.getOriginalFilename();
        log.info("上传的文件名为:" + fileName);//写日志
        // 获取文件的后缀名
        String suffixName = fileName.substring(fileName.lastIndexOf("."));
        log.info("文件的后缀名为:" + suffixName);//写日志
        // 设置文件存储路径         *************************************************
        String path = filePath + fileName;
        File dist = new File(new File(path).getAbsolutePath());// dist为文件,有多级目录的文件
        // 检测是否存在目录
        if (!dist.getParentFile().exists()) {//因此这里使用.getParentFile(),目的就是取文件前面目录的路径
            dist.getParentFile().mkdirs();// 新建文件夹
        }
        file.transferTo(dist);// 文件写入
        return "上传成功";
    } catch (IllegalStateException | IOException e) {
        e.printStackTrace();
    }
    return "上传失败";
}

上传多个文件

@PostMapping("/batch")
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);
        File dest = new File(filePath);
        // 检测是否存在目录
        if (!dest.exists()) {
            dest.mkdirs();// 新建文件夹
        }
        if (!file.isEmpty()) {
            try {
                byte[] bytes = file.getBytes();
                stream = new BufferedOutputStream(new FileOutputStream(
                    filePath + file.getOriginalFilename()));//设置文件路径及名字
                stream.write(bytes);// 写入
                stream.close();
            } catch (Exception e) {
                stream = null;
                return "第 " + i + " 个文件上传失败 ==> " + e.getMessage();
            }
        } else {
            return "第 " + i + " 个文件上传失败因为文件为空";
        }
    }
    return "上传成功";
}

文件下载

只能是单个文件下载

@GetMapping("/download")
public String downloadFile(HttpServletRequest request, HttpServletResponse response) {
    String fileName = "dump.rdb";// 要被下载的文件名
    //设置文件路径
    File file = new File(filePath + 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);
            }
            return "下载成功";
        } 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 "下载失败";
}
  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答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应用程序,你可以向你的应用程序添加强大的功能,从而更好地满足你的业务需求。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙域、白泽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值