9.SpringMVC-下载和上传的实现

本文最后更新于2024.04.28-07:44,某些文章具有时效性,若有错误或已失效,请在下方留言或联系涛哥

下载的实现

1.直接使用 a标签 并在超链接里 写入要下载的资源的路径

弊端:

1.需要配置 静态资源访问 否则会被SpringMVC 前端控制器拦截到

2.会暴露 项目的资源的路径

3.没有办法进行业务判断,比如是否有权限下载。

2.思路:

1.获取到要下载的文件的 绝对路径。

2.获取 对该文件的 输出流,和利用response对象获取到 输出流。

3.设置响应头

4.一边用输入流读,一边用输出流写。

5.关闭输入流。

    @RequestMapping("download1")
    public String download01(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //获取绝对路径
        String path = request.getServletContext().getRealPath("file");
        System.out.println(path);
        //获取该路径对应的 file对象
        File file = new File(path+"/"+"美美哒.jpg");
        //获取输入流,用于读上述对象
        FileInputStream fis = new FileInputStream(file);
        //获取输出流,用于写回客户端
        OutputStream outputStream = response.getOutputStream();
        //设置响应头的格式,确保文件是被下载而不是被浏览器直接打开
        response.setHeader("content-disposition","attachment;filename="+ URLEncoder.encode(file.getName(),"UTF-8"));
        //io读写
        byte[] bytes = new byte[1024];
        int num = 0;
        while((num=fis.read(bytes))!=-1){
            outputStream.write(bytes,0,num);
        }
        //关闭输入流,输出流不需要我们处理
        fis.close();
        return null;
    }

3.利用 ResponseEntity<byte[]> 进行下载

 

不推荐(当下载文件过大时,由于无法使用缓冲区,可能会导致内存溢出)

    @RequestMapping("download2")
    public ResponseEntity<byte[]> download02(HttpServletRequest request) throws IOException {
        String path = request.getServletContext().getRealPath("file");
        File file = new File(path+"/"+"美美哒.jpg");
        InputStream ins = new FileInputStream(file);
        int length = ins.available();
        byte[] bytes = new byte[length];
        ins.read(bytes);
        HttpHeaders header = new HttpHeaders();
        header.add("content-disposition","attachment;filename="+ URLEncoder.encode(file.getName(),"UTF-8"));
        return new ResponseEntity<byte[]>(bytes,header, HttpStatus.OK);
    }

上传的实现

1.导入 commons-fileuploadjar包

  <dependency>
          <groupId>commons-fileupload</groupId>
          <artifactId>commons-fileupload</artifactId>
          <version>1.3.1</version>
  </dependency>

2.在spring-mvc.xml里配置 上传解析器

 

    <bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver" id="multipartResolver">
        <!--  设置编码格式       -->
        <property name="defaultEncoding" value="UTF-8"></property>
        <!--  设置上传文件的 最大文件大小       -->
        <property name="maxUploadSize" value="#{2*1024*1024}"></property>
    </bean>

3.上传的表单 修改 enctype为 multipart/form-data

 

4.后端的控制器中使用 MutlpartFile 接受上传的文件

@Controller
public class UploadController {
​
    @RequestMapping("uploadUser")
    //使用MultiPartFile 对象来接受 上传的文件
    //MultipartFile[] userImg 用于多文件上传
    public String userRegister(User user, MultipartFile[] userImg) throws IOException {
//        System.out.println(user);
//        System.out.println(userImg);
//        //获取上传的文件的 表单组建的name属性
//        System.out.println(userImg.getName());
//        //获取 上传文件的 文件类型 真实类型 和文件名无关
//        System.out.println(userImg.getContentType());
//        //获取文件大小 单位字节
//        System.out.println(userImg.getSize());
//        //获取上传文件的 真实文件名
//        System.out.println(userImg.getOriginalFilename());
//        File file = new File("c:/userImages/"+userImg.getOriginalFilename());
        //复制文件 到指定的file对象
//        userImg.transferTo(file);
        for(MultipartFile mf:userImg){
            File file = new File("c:/userImages/"+mf.getOriginalFilename());
            mf.transferTo(file);
        }
        return null;
    }
}

小练习

做一个 注册页,注册也 输入用户名 密码 性别 头像(上传) 个人简历(word)

注册成功后 跳转到 用户信息页面

显示欢迎....用户 显示用户头像

在下面 下载个人简历

阅读剩余
THE END