SpringMVC实现文件上传下载功能(springmvc文件上传下载)

网友投稿 270 2022-07-30


目录导入需要的依赖包一、单个文件上传二、多个文件上传三、上传文件列表显示四、文件下载

今天遇到文件上传的问题,使用Ajax方式进行提交,服务器一直报错The current request is not a multipart request,看了网上很多方法,最后才找到,我在表单提交的时候使用了序列化$('#postForm').serialize(),但是这种方式,只能传递一般的参数,上传文件的文件流是无法被序列化并传递的。所以一直在报错。后来就直接使用submint(),放弃使用Ajax。不过还是想记下来,以备不时之需。

接下来进入正题:在SSM框架下实现文件上传和下载

导入需要的依赖包

pom.xml

commons-fileupload

commons-fileupload

1.3.1

commons-io

commons-io

2.4

commons-codec

commons-codec

1.9

web.xml

xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"

id="WebApp_ID" version="3.0">

MyDispatcher

org.springframework.web.servlet.DispatcherServlet

contextConfigLocation

/WEB-INF/springMVC-servlet.xml

1

MyDispatcher

/

xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"

id="WebApp_ID" version="3.0">

MyDispatcher

org.springframework.web.servlet.DispatcherServlet

contextConfigLocation

/WEB-INF/springMVC-servlet.xml

1

MyDispatcher

/

MyDispatcher

/

spring-mvc.xml

xmlns:context="http://springframework.org/schema/context"

xmlns:util="http://springframework.org/schema/util"

xmlns:xsi="http://w3.org/2001/XMLSchema-instance" xmlns:p="http://springframework.org/schema/p"

xmlns:mvc="http://springframework.org/schema/mvc"

xsi:schemaLocation="

http://springframework.org/schema/util

http://springframework.org/schema/util/spring-util-3.0.xsd

http://springframework.org/schema/mvc

http://springframework.org/schema/mvc/spring-mvc-3.0.xsd

http://springframework.org/schema/beans

http://springframework.org/schema/beans/spring-beans-3.0.xsd

http://springframework.org/schema/mvc

http://springframework.org/schema/mvc/spring-mvc-3.0.xsd

http://springframework.org/schema/context

http://springframework.org/schema/context/spring-context-3.0.xsd">

/>

xmlns:context="http://springframework.org/schema/context"

xmlns:util="http://springframework.org/schema/util"

xmlns:xsi="http://w3.org/2001/XMLSchema-instance" xmlns:p="http://springframework.org/schema/p"

xmlns:mvc="http://springframework.org/schema/mvc"

xsi:schemaLocation="

http://springframework.org/schema/util

http://springframework.org/schema/util/spring-util-3.0.xsd

http://springframework.org/schema/mvc

http://springframework.org/schema/mvc/spring-mvc-3.0.xsd

http://springframework.org/schema/beans

http://springframework.org/schema/beans/spring-beans-3.0.xsd

http://springframework.org/schema/mvc

http://springframework.org/schema/mvc/spring-mvc-3.0.xsd

http://springframework.org/schema/context

http://springframework.org/schema/context/spring-context-3.0.xsd">

/>

/>

一、单个文件上传

JSP,这个页面是用来上传又用来显示上传后的图片的页面fileUpload.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<%@ taglib prefix="form" uri="http://springframework.org/tags/form"%>

<%

String path = request.getContextPath();

String basePath = request.getScheme() + "://"

+ request.getServerName() + ":" + request.getServerPort()

+ path + "/";

%>

method="post" enctype="multipart/form-data">

暂无图片

Conroller层

1、方法一

@Controller

@RequestMapping("/file")

public class FileController {

@RequestMapping("/toFile")

public String toFileUpload() {

return "fileUpload";

}

@RequestMapping("/toFile2")

public String toFileUpload2() {

return "fileUpload2";

}

/**

* 方法一上传文件

*/

@RequestMapping("/onefile")

public String oneFileUpload(@RequestParam("file") MultipartFile file,HttpServletRequest request,HttpServletResponse response) {

// 获得原始文件名

String fileName = file.getOriginalFilename();

System.out.println("原始文件名:" + fileName);

//避免文件名重复使用uuid来避免,产生一个随机的uuid字符,并赋予一个新的文件名

String newFileName = UUID.randomUUID() + fileName;

// 获得项目的路径

ServletContext servletContext = request.getSession().getServletContext();

// 上传位置

String path=servletContext.getRealPath("/upload")+"/"; //设定文件保存的目录

File f = new File(path);

if (!f.exists())

f.mkdirs();

if (!file.isEmpty()) {

try {

FileOutputStream fos = new FileOutputStream(path + newFileName);

InputStream in = file.getInputStream();

int b = 0;

while ((b = in.read()) != -1) {

fos.write(b);

}

fos.close();

in.close();

} catch (Exception e) {

e.printStackTrace();

}

}

System.out.println("上传图片到:" + path + newFileName);

// 保存文件地址,用于JSP页面回显

model.addAttribute("fileUrl", path + newFileName);

return "fileUpload";

}

运行后的效果:

原始文件名:1522330092612.jpg

上传位置:D:\tomcat-8.5.43\webapps\telecomsystem\upload

效果图:

上传前

上传后

2、方法二:使用文件流的方式来上传

/**

* 方法二上传文件,一次一张

*/

@RequestMapping("/onefile2")

public String oneFileUpload2(HttpServletRequest request,

HttpServletResponse response) throws Exception {

CommonsMultipartResolver cmr = new CommonsMultipartResolver(

request.getServletContext());

if (cmr.isMultipart(request)) {

MultipartHttpServletRequest mRequest = (MultipartHttpServletRequest) (request);

Iterator files = mRequest.getFileNames();

while (files.hasNext()) {

MultipartFile mFile = mRequest.getFile(files.next());

if (mFile != null) {

String fileName = UUID.randomUUID()

+ mFile.getOriginalFilename();

String path = "d:/upload/" + fileName;

File localFile = new File(path);

mFile.transferTo(localFile);

request.setAttribute("fileUrl", path);

}

}

}

return "fileUpload";

}

jsp部分代码:

method="post" enctype="multipart/form-data">

暂无图片

方法二指定上传到了本地E盘的upload文件夹

二、多个文件上传

多个文件上传其实就是将单文件上传的方法一中修改成循环就可以了

JSP显示页面fileUpload2.jsp

<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<%@ taglib prefix="form" uri="http://springframework.org/tags/form"%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<%

String path = request.getContextPath();

String basePath = request.getScheme() + "://"

+ request.getServerName() + ":" + request.getServerPort()

+ path + "/";

%>

enctype="multipart/form-data">


name="file" />

type="submit" value="上 传" />

暂无图片

</center>

Controller层

/**

* 一次上传多张图片

*/

@RequestMapping("/threeFile")

public String threeFileUpload(

@RequestParam("file") CommonsMultipartFile files[],

HttpServletRequest request, ModelMap model) {

List list = new ArrayList();

// 获得项目的路径

ServletContext sc = request.getSession().getServletContext();

// 上传位置

String path = sc.getRealPath("/img") + "/"; // 设定文件保存的目录

File f = new File(path);

if (!f.exists())

f.mkdirs();

for (int i = 0; i < files.length; i++) {

// 获得原始文件名

String fileName = files[i].getOriginalFilyrUvIKSrsename();

System.out.println("原始文件名:" + fileName);

// 新文件名

String newFileName = UUID.randomUUID() + fileName;

if (!files[i].isEmpty()) {

try {

FileOutputStream fos = new FileOutputStream(path

+ newFileName);

InputStream in = files[i].getInputStream();

int b = 0;

while ((b = in.read()) != -1) {

fos.write(b);

}

fos.close();

in.close();

} catch (Exception e) {

e.printStackTrace();

}

}

System.out.println("上传图片到:" + path + newFileName);

list.add(path + newFileName);

}

// 保存文件地址,用于JSP页面回显

model.addAttribute("fileList", list);

return "fileUpload2";

}

三、上传文件列表显示

jsp文件listFile.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

${me.value}下载

Controller层

/**

* 列出所有的图片

*/

@RequestMapping("/listFile")

public String listFile(HttpServletRequest request,

HttpServletResponse response) {

// 获取上传文件的目录

ServletContext sc = request.getSession().getServletContext();

// 上传位置

String uploadFilePath = sc.getRealPath("/img") + "/"; // 设定文件保存的目录

// 存储要下载的文件名

Map fileNameMap = new HashMap();

// 递归遍历filepath目录下的所有文件和目录,将文件的文件名存储到map集合中

listfile(new File(uploadFilePath), fileNameMap);// File既可以代表一个文件也可以代表一个目录

// 将Map集合发送到listfile.jsp页面进行显示

request.setAttribute("fileNameMap", fileNameMap);

return "listFile";

}

四、文件下载

Controller层

@RequestMapping("/downFile")

public void downFile(HttpServletRequest request,

HttpServletResponse response) {

System.out.println("1");

// 得到要下载的文件名

String fileName = request.getParameter("filename");

System.out.println("2");

try {

fileName = new String(fileName.getBytes("iso8859-1"), "UTF-8");

System.out.println("3");

// 获取上传文件的目录

ServletContext sc = request.getSession().getServletContext();

System.out.println("4");

// 上传位置 http://

String fileSaveRootPath = sc.getRealPath("/img");

System.out.println(fileSaveRootPath + "\\" + fileName);

// 得到要下载的文件

File file = new File(fileSaveRootPath + "\\" + fileName);

// 如果文件不存在

if (!file.exists()) {

request.setAttribute("message", "您要下载的资源已被删除!!");

System.out.println("您要下载的资源已被删除!!");

return;

}

// 处理文件名

String realname = fileName.substring(fileName.indexOf("_") + 1);

// 设置响应头,控制浏览器下载该文件

response.setHeader("content-disposition", "attachment;filename="

+ URLEncoder.encode(realname, "UTF-8"));

// 读取要下载的文件,保存到文件输入流

FileInputStream in = new FileInputStream(fileSaveRootPath + "\\" + fileName);

// 创建输出流

OutputStream out = response.getOutputStream();

// 创建缓冲区

byte buffer[] = new byte[1024];

int len = 0;

// 循环将输入流中的内容读取到缓冲区当中

while ((len = in.read(buffer)) > 0) {

// 输出缓冲区的内容到浏览器,实现文件下载

out.write(buffer, 0, len);

}

// 关闭文件输入流

in.close();

// 关闭输出流

out.close();

} catch (Exception e) {

}

}

注:这里是通过文件流的方式来下载图片的。

以上就是SpringMVC实现文件上传下载功能的详细内容,更多关于SpringMVC文件上传下载的资料请关注我们其它相关文章!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java使用lambda自定义Arrays.sort排序规则说明(arrays.sort()降序lambda表达式)
下一篇:Java并发编程之volatile与JMM多线程内存模型(java 多线程 volatile)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~