博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
springmvc里的文件上传和下载
阅读量:3965 次
发布时间:2019-05-24

本文共 6268 字,大约阅读时间需要 20 分钟。

文件的上传和下载参考博客:

1、准备工作

文件上传是项目开发中最常见的功能之一 ,springMVC 可以很好的支持文件上传,但是SpringMVC上 下文中默认没有装配MultipartResolver,因此默认情况下其不能处理文件上传工作。如果想使用Spring 的文件上传功能,则需要在上下文中配置MultipartResolver

前端表单要求:为了能上传文件,必须将表单的method设置为POST,并将enctype设置为 multipart/form-data。只有在这样的情况下,浏览器才会把用户选择的文件以二进制数据发送给服务 器;
对表单中的 enctype 属性做个详细的说明

  • application/x-www=form-urlencoded: 默认方式,只处理表单域中的 value 属性值,采用这种编 码方式的表单会将表单域中的值处理成 URL 编码方式。
  • multipart/form-data: 这种编码方式会以二进制流的方式来处理表单数据,这种编码方式会把文 件域指定文件的内容也封装到请求参数中,不会对字符编码。
  • text/plain: 除了把空格转换为 “+” 号外,其他字符都不做编码处理,这种方式适用直接通过表单 发送邮件。

一旦设置了enctype为multipart/form-data,浏览器即会采用二进制流的方式来处理表单数据,而对 于文件上传的处理则涉及在服务器端解析原始的HTTP响应。在2003年,Apache Software Foundation 发布了开源的Commons FileUpload组件,其很快成为Servlet/JSP程序员上传文件的最佳选择。

  • Servlet3.0规范已经提供方法来处理文件上传,但这种上传需要在Servlet中完成。
  • 而Spring MVC则提供了更简单的封装。
  • Spring MVC为文件上传提供了直接的支持,这种支持是用即插即用的MultipartResolver实现的。
  • Spring MVC使用Apache Commons FileUpload技术实现了一个MultipartResolver实现类: CommonsMultipartResolver。因此,SpringMVC的文件上传还需要依赖Apache Commons FileUpload的组件

2、文件上传

1. 导入文件上传的jar包,

commons-fileupload , Maven会自动帮我们导入他的依赖包 commonsio包;

pom.xml
这里有个问题导入高版本的这个包会报500错误。可能与TOMCAT不兼容,解决办法暂未找到,可降低版本为3.0.1

javax.servlet
javax.servlet-api
4.0.1
commons-fileupload
commons-fileupload
1.4

2. applicationContext.xml配置bean:multipartResolver

注意!!!这个bena的id必须为:multipartResolver , 否则上传文件会报400的错误!在这 里栽过坑,教训!】

完整的:

CommonsMultipartFile 的 常用方法:

  • String getOriginalFilename():获取上传文件的原名
  • InputStream getInputStream():获取文件流
  • void transferTo(File dest):将上传文件保存到一个目录文件中

3. 编写前端页面

4. Controller

package com.loey.controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.multipart.commons.CommonsMultipartFile;import javax.servlet.http.HttpServletRequest;import java.io.*;@RestControllerpublic class UploadFile {
//@RequestParam("file") 将name=file控件得到的文件封装成 CommonsMultipartFile 对象 // 批量上传CommonsMultipartFile则为数组即可 @RequestMapping("/upload") public String UploadFile(@RequestParam("file") CommonsMultipartFile file, HttpServletRequest request) throws IOException {
//获取文件名 : file.getOriginalFilename(); String uploadFileName = file.getOriginalFilename(); //如果文件名为空,直接返回错误信息 if("".equals(uploadFileName)){
return "错误,文件名为空"; } //上传路径保存设置 String path = request.getServletContext().getRealPath("/upload"); //如果路径不存在,创建一个 File realPath = new File(path); if(!realPath.exists()){
realPath.mkdir(); } //文件输入流 InputStream is = file.getInputStream(); //文件输出流 OutputStream os = new FileOutputStream(new File(realPath, uploadFileName)); int len = 0; byte[] buffer = new byte[1024]; //读取写出 while ((len = is.read(buffer)) != -1){
os.write(buffer,0,len); os.flush(); } os.close(); is.close(); return "文件上传成功"; }}

结果:

在这里插入图片描述

3、采用file.Transto 来保存上传的文件

编写Controller

@RequestMapping("/upload1")    public String UploadFile1(@RequestParam("file") CommonsMultipartFile file,                              HttpServletRequest request) throws IOException {
//获取文件名 : file.getOriginalFilename(); String uploadFileName = file.getOriginalFilename(); //如果文件名为空,直接返回错误信息 if("".equals(uploadFileName)){
return "错误,文件名为空"; } //上传路径保存设置 String path = request.getServletContext().getRealPath("/upload"); //如果路径不存在,创建一个 File realPath = new File(path); if(!realPath.exists()){
realPath.mkdir(); } file.transferTo(new File(realPath + "/" + uploadFileName)); return "文件上传成功"; }

4、文件下载

文件下载步骤:

  1. 设置 response 响应头
  2. 读取文件 – InputStream
  3. 写出文件 – OutputStream
  4. 执行操作
  5. 关闭流 (先开后关)

代码实现:

controller:

package com.loey.controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.File;import java.io.FileInputStream;import java.io.OutputStream;import java.io.UnsupportedEncodingException;import java.net.URLEncoder;@RestControllerpublic class DownLoadFile {
@RequestMapping("/downLoad") public String dolwnLoad(HttpServletRequest request, HttpServletResponse response) throws Exception {
//要下载的图片地址 String path = request.getServletContext().getRealPath("/upload"); String fileName = "1.jpg"; //1、设置response 响应头 response.reset();//设置页面不缓存,清空buffer response.setCharacterEncoding("UTF-8"); //字符编码 response.setContentType("multipart/form-data"); //二进制传输数据 //设置响应头 response.setHeader("Content-Disposition","attachment;fileName="+ URLEncoder.encode(fileName, "UTF-8")); File file = new File(path, fileName); //2、读取文件-输入流 FileInputStream fis = new FileInputStream(file); //3、写出文件--输出流 OutputStream out = response.getOutputStream(); byte[] buffer = new byte[1024]; int len = 0; //4、执行写出操作 while ((len = fis.read(buffer)) != -1){
out.write(buffer,0,len); out.flush(); } out.close(); fis.close(); return "下载成功"; }}

download.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>    Title点击下载

转载地址:http://ytuki.baihongyu.com/

你可能感兴趣的文章
NRZ NRZI及扰码等串行编码技术的基本概念
查看>>
ADV7604介绍(一)
查看>>
无人机光电系统图像处理模块
查看>>
VP6802高清视频处理模块
查看>>
VP6802S01高清视频输入模块
查看>>
VP6803高清视频处理模块
查看>>
CAN总线基础知识(一)
查看>>
CAN总线基础知识(二)
查看>>
DM8148的电源和地(二)
查看>>
基于陀螺进行运动检测的电子稳像方案
查看>>
数字视频基础(一)
查看>>
AM5728概述(1)
查看>>
AM5728概述(4)
查看>>
AM5728概述(6)
查看>>
RapidIO协议(1)
查看>>
RapidIO协议(2)
查看>>
DM8168 EMAC/MDIO模块(2)
查看>>
DM8168 EMAC/MDIO模块(3)
查看>>
DM8168 EMAC/MDIO模块(4)
查看>>
DM8168 EMAC/MDIO模块(5)
查看>>