• springmvc实现文件上传下载


    需求:再web项目中,可能会出现需要上传文件,如用户注册上传头像,上传照片,或其他资源等

    springmvc实现文件上传:

    1.导入jar包:

    2设置表单:

    <!--当表单中存在文件上传时,需要再form表单中添加enctype="multipart/form-data"属性,而且提交方式必须为post请求,不然上传图片等会报错-->
    <form action="../file" method="post" enctype="multipart/form-data">
        <input type="file" name="img">
        <input type="submit">
    </form>

    3.设置文件上传视图解析器:

    <!--配置文件上传视图解析器-->
        <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
            <!--设置编码格式-->
            <property name="defaultEncoding" value="utf-8"/>
            <!--设置文件最大的大小10M-->
            <property name="maxInMemorySize" value="#{10*1024*1024}"/>
        </bean>

    4.上传功能后台:

    @Controller
    public class FileController {
    
        /*@RequestParam("img) 将前端请求中指定name的数据放入参数中*/
        @RequestMapping("/file")
        public String file(@RequestParam("img") MultipartFile file, HttpServletRequest request) {
    //        获取原始文件名
            String trueName = file.getOriginalFilename();
    //        设置文件保存的路径:当前项目的下的/static/upload/文件夹下;因为运行时是编译后的文件再tomcat服务器中运行,
    //        因此查看是否上传成功需要再class文件中查看
            String path = request.getSession().getServletContext().getRealPath("/static/upload/");
    //        设置上传文件保存本地的文件名及路径
            File file1 = new File(path + trueName);
    //        判断当前文件父级文件夹是否存在,如果不存在,就创建文件夹
            if (!file1.getParentFile().exists()) {
                file1.mkdirs();
            }
            try {
    //            上传文件,核心功能
                file.transferTo(file1);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return "index";
        }
    }

    一个最简单的上传功能就完成了,不过这种方式并不好,因为如果有多人操作,出现上传文件名相同等问题,会覆盖,因此要生成一个不会重复的文件名:

    1.使用时间来设置文件名:

    上传后保存路径:

    2.使用UUID类:

    其他的内容都一样,生成文件名如下:

    文件的下载:

     1.可以直接前端设置a标签连接文件地址:

     

    右击链接另存就可以下载了;

    2.写一个后台控制器:

    package com.zs.controller;
    
    import com.sun.xml.internal.messaging.saaj.packaging.mime.internet.MimeUtility;
    import org.apache.commons.io.FileUtils;
    import org.springframework.http.HttpHeaders;
    import org.springframework.http.HttpStatus;
    import org.springframework.http.MediaType;
    import org.springframework.http.ResponseEntity;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    
    import javax.servlet.http.HttpServletRequest;
    import java.io.File;
    import java.io.IOException;
    import java.net.URLEncoder;
    
    @Controller
    public class DownLoadController {
    
        @RequestMapping("/down")
        public ResponseEntity<byte[]> download(@RequestParam("filename") String filename, HttpServletRequest request) throws IOException {
            String path = request.getSession().getServletContext().getRealPath("/static/upload/");
            File file = new File(path + filename);
    
            String encodedFileName = null;
    //        获取User-Agent,借此判断是哪儿种类型的浏览器
            String header = request.getHeader("User-Agent");
            if (header.indexOf("Chrome") > 0)
                encodedFileName = URLEncoder.encode(filename, "utf-8").replaceAll("\+", "%20");
            else
                encodedFileName = MimeUtility.encodeWord(filename);
    
            byte[] bytes = FileUtils.readFileToByteArray(file);
            HttpHeaders headers = new HttpHeaders();
            //设置响应的文档类型:二进制形式
            headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
            //弹出下载窗口,并制定文件名
            headers.setContentDispositionFormData("attachment", encodedFileName);
            //状态码
            HttpStatus httpStatus = HttpStatus.CREATED;
            ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, headers, httpStatus);
            return responseEntity;
        }
    }

    前端页面传要下载的图片名:

  • 相关阅读:
    WPF 登录窗口关闭时打开主窗口
    WPF Expander获得ToggleButton
    .NET Framework 4 与 .NET Framework 4 Client Profile
    WPF 根据枚举值名称 获得枚举值
    WPF KeyDown不响应方向键、Home/End/PgUp/PgDn等功能键
    C# MemoryStream和BinaryFormatter
    VB INET控件的全部用法
    C#写文件方法总结
    C#实现ADSL拨号(源代码例程)
    使用C#实现ADSL自动拨号(原理及封闭类)
  • 原文地址:https://www.cnblogs.com/Zs-book1/p/11328796.html
Copyright © 2020-2023  润新知