文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Spring Boot实现文件上传和下载

2023-09-06 06:20

关注

实现Spring Boot文件上传和下载的步骤:

1.文件上传

2.文件下载

以下是Spring Boot实现文件上传和下载的代码示例:

1.文件上传

  commons-fileupload  commons-fileupload  1.3.3  javax.servlet  javax.servlet-api  4.0.1  provided
@PostMapping("/upload")@ResponseBodypublic String upload(@RequestParam("file") MultipartFile file) {    if (file.isEmpty()) {        return "上传失败,请选择文件";    }    // 获取文件名    String fileName = file.getOriginalFilename();    // 获取文件的后缀名    String suffixName = fileName.substring(fileName.lastIndexOf("."));    // 上传后的路径    String filePath = "D:/upload/";    // 解决中文问题,liunx下中文路径,图片显示问题    fileName = UUID.randomUUID() + suffixName;    // 构建上传路径    File dest = new File(filePath + fileName);    // 检测是否存在目录    if (!dest.getParentFile().exists()) {        dest.getParentFile().mkdirs();    }    try {        // 保存文件        file.transferTo(dest);        return "上传成功";    } catch (IllegalStateException e) {        e.printStackTrace();    } catch (IOException e) {        e.printStackTrace();    }    return "上传失败";}

2.文件下载

@GetMapping("/download")public ResponseEntity<byte[]> download() throws IOException {    // 获取文件    File file = new File("D:/upload/1.jpg");    // 构造响应    HttpHeaders headers = new HttpHeaders();    headers.setContentDispositionFormData("attachment", file.getName());    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);    return new ResponseEntity<>(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED);}
编写Controller方法@GetMapping("/download")public void downloadFile(HttpServletResponse response) {    try {        //获取要下载的文件        File file = new File("file_path");        //设置响应的内容类型为二进制流,即文件类型        response.setContentType("application/octet-stream");        //设置文件名        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(file.getName(), "UTF-8"));        //创建输入流        FileInputStream inputStream = new FileInputStream(file);        BufferedInputStream buffInputStream = new BufferedInputStream(inputStream);        //创建输出流        ServletOutputStream outputStream = response.getOutputStream();        BufferedOutputStream buffOutputStream = new BufferedOutputStream(outputStream);        //循环读取数据并写入到响应输出流中        byte[] buffer = new byte[1024];        int len = -1;        while ((len = buffInputStream.read(buffer)) != -1) {            buffOutputStream.write(buffer, 0, len);        }        //关闭流        buffOutputStream.flush();        buffOutputStream.close();        outputStream.flush();        outputStream.close();        buffInputStream.close();        inputStream.close();    } catch (Exception e) {        e.printStackTrace();    }}
SpringBoot中,我们可以通过以下步骤实现文件响应给浏览器实现下载:在Controller中编写请求处理方法,并使用@GetMapping注解来指定该方法处理GET请求。在方法中使用InputStreamResource将本地文件以流的形式读取到内存中。使用ResponseEntity.ok()方法构造响应,并将之前获取到的InputStreamResource作为参数传入。使用.header()方法设置响应头,包括Content-DispositionContent-Type等信息。以下是一个示例代码:import org.springframework.core.io.InputStreamResource;import org.springframework.http.HttpHeaders;import org.springframework.http.MediaType;import org.springframework.http.ResponseEntity;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.GetMapping;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;@Controllerpublic class FileDownloadController {        @GetMapping("/download")    public ResponseEntity<InputStreamResource> downloadFile() throws IOException {        String filename = "example.txt";        InputStream is = new FileInputStream(filename);        InputStreamResource resource = new InputStreamResource(is);        HttpHeaders headers = new HttpHeaders();        headers.add("Content-Disposition", "attachment; filename=\"" + filename + "\"");        headers.add("Cache-Control", "no-cache, no-store, must-revalidate");        headers.add("Pragma", "no-cache");        headers.add("Expires", "0");                return ResponseEntity.ok()                .headers(headers)                .contentLength(is.available())                .contentType(MediaType.parseMediaType("application/octet-stream"))                .body(resource);    }}其中,Content-Disposition头用于描述响应结果的类型,这里指定为attachment表示要下载的文件,filename表示文件名。Cache-ControlPragmaExpires头用于控制缓存的行为,这里设为不缓存。最后将InputStreamResource对象作为响应体返回即可。

来源地址:https://blog.csdn.net/qq_45525848/article/details/129344889

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯