Spring文件上传下载代码

Spring文件上传下载代码

文件上传

MultipartFile是SpringMVC提供简化上传操作的工具类。

java 复制代码
	/**
     * 文件上传接口
     *
     * @param file
     * @return
     */
    @PostMapping("/fileUpload")
    public String fileUpload(@RequestParam("file") MultipartFile file) {
        // 用户鉴权,判断有无权限上传,此处逻辑省略

        // 文件判空
        if (file.isEmpty()) {
            return "上传失败,文件为空";
        }
        List<String> suffixList = new ArrayList<String>() {{
            add("pdf");
            add("xls");
        }};
        // 获取文件后缀
        String originalFilename = file.getOriginalFilename();
        String suffix = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
        // 校验文件后缀
        if (!suffixList.contains(suffix)) {
            return "文件类型不合法";
        }

        // 限制文件大小 5M , file.getSize()单位为字节
        if (file.getSize() > 5 * 1024 * 1024) {
            return "文件大小超出限制";
        }

        try {
            // 构建文件名
            // 获得当前项目所在文件夹
            String fileDir = System.getProperty("user.dir") + File.separator + "/file/";
            String fileName = "MyFile";
            // 首次上传需先创建文件夹
            File dir = new File(fileDir);
            if (!dir.exists()) {
                dir.mkdirs();
            }
            // 保存文件
            file.transferTo(new File(fileDir + fileDir + "." + suffix));

        } catch (Exception e) {
            return "文件上传失败";
        }
        return "文件上传成功";
    }

文件下载:

java 复制代码
	@GetMapping("fileDownLoad")
    public void fileDownLoad(HttpServletResponse response) {
        FileInputStream fileInputStream = null;
        try{
            String fileName = "Myfile.exe";
            String absolutePath = System.getProperty("user.dir") + File.separator + "/file/" + fileName;
            File file = new File(absolutePath);
            fileInputStream = new FileInputStream(file);
            // 设置response 头部
            response.reset();
            response.setContentType("application/load;charset=UTF-8");
             //Content-Disposition的作用:告知浏览器以何种方式显示响应返回的文件,用浏览器打开还是以附件的形式下载到本地保存
            //attachment表示以附件方式下载 inline表示在线打开 "Content-Disposition: inline; filename=文件名.mp3"
            // filename表示文件的默认名称,因为网络传输只支持URL编码的相关支付,因此需要将文件名URL编码后进行传输,前端收到后需要反编码才能获取到真正的名称
            response.setHeader("Content-Disposition", "attachment;filename="
            + new String(file.getName().getBytes("utf-8"), "iso-8859-1"));
            // 将输入流数据写入到响应输出流中
            ServletOutputStream sos = response.getOutputStream();
            byte[] b = new byte[1024];
            int len;
            while((len = fileInputStream.read(b)) > 0) {
                sos.write(b, 0, len);
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
        } finally {
            if(fileInputStream != null) {
                try{
                    fileInputStream.close();
                } catch (IOException e) {
                    System.out.println(e.getMessage());
                }
            }
        }
    }
相关推荐
★YUI★13 分钟前
学习游戏制作记录(玩家掉落系统,删除物品功能和独特物品)8.17
java·学习·游戏·unity·c#
微小的xx16 分钟前
java + html 图片点击文字验证码
java·python·html
mask哥28 分钟前
详解flink java基础(一)
java·大数据·微服务·flink·实时计算·领域驱动
克拉克盖博1 小时前
chapter03_Bean的实例化与策略模式
java·spring·策略模式
创码小奇客1 小时前
架构师私藏:SpringBoot 集成 Hera,让日志查看从 “找罪证” 变 “查答案”
spring boot·spring cloud·trae
DashVector1 小时前
如何通过Java SDK分组检索Doc
java·数据库·面试
程序员清风1 小时前
跳表的原理和时间复杂度,为什么还需要字典结构配合?
java·后端·面试
渣哥1 小时前
Kafka消息丢失的3种场景,生产环境千万要注意
java
渣哥1 小时前
ElasticSearch深度分页的致命缺陷,千万数据查询秒变蜗牛
java
Olrookie1 小时前
XXL-JOB GLUE模式动态数据源实践:Spring AOP + MyBatis 解耦多库查询
java·数据库·spring boot