时间:2020-12-13来源:www.pcxitongcheng.com作者:电脑系统城
文件上传一直是Web项目中必不可少的一项功能。
项目结构如下:(这是我之前创建的SSM整合的框架项目,在这上面添加文件上传与下载)
主要的是FileUploadController,doupload.jsp,up.jsp,springmvc.xml
1.先编写up.jsp
1 2 3 4 5 6 |
< form action = "doupload.jsp" enctype = "multipart/form-data" method = "post" > < p >上传者:< input type = "text" name = "user" ></ p > < p >选择文件:< input type = "file" name = "nfile" ></ p > < p >选择文件:< input type = "file" name = "nfile1" ></ p > < p >< input type = "submit" value = "提交" ></ p > </ form > |
以上便是up.jsp的核心代码;
2.编写doupload.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
<% request.setCharacterEncoding( "utf-8" ); String uploadFileName = "" ; //上传的文件名 String fieldName = "" ; //表单字段元素的name属性值 //请求信息中的内容是否是multipart类型 boolean isMultipart = ServletFileUpload.isMultipartContent(request); //上传文件的存储路径(服务器文件系统上的绝对文件路径) String uploadFilePath = request.getSession().getServletContext().getRealPath( "upload/" ); if (isMultipart) { FileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); try { //解析form表单中所有文件 List<FileItem> items = upload.parseRequest(request); Iterator<FileItem> iter = items.iterator(); while (iter.hasNext()) { //依次处理每个文件 FileItem item = (FileItem) iter.next(); if (item.isFormField()){ //普通表单字段 fieldName = item.getFieldName(); //表单字段的name属性值 if (fieldName.equals( "user" )){ //输出表单字段的值 out.print(item.getString( "UTF-8" )+ "上传了文件。<br/>" ); } } else { //文件表单字段 String fileName = item.getName(); if (fileName != null && !fileName.equals( "" )) { File fullFile = new File(item.getName()); File saveFile = new File(uploadFilePath, fullFile.getName()); item.write(saveFile); uploadFileName = fullFile.getName(); out.print( "上传成功后的文件名是:" +uploadFileName); out.print( "\t\t下载链接:" + "<a href='download.action?name=" +uploadFileName+ "'>" +uploadFileName+ "</a>" ); out.print( "<br/>" ); } } } } catch (Exception e) { e.printStackTrace(); } } %> |
该页面主要是内容是,通过解析request,并设置上传路径,创建一个迭代器,先进行判空,再通过循环来实现多个文件的上传,再输出文件信息的同时打印文件下载路径。
效果图:
3.编写FilterController实现文件下载的功能(相对上传比较简单):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
@Controller public class FileUploadController { @RequestMapping (value= "/download" ) public ResponseEntity< byte []> download(HttpServletRequest request,HttpServletResponse response, @RequestParam ( "name" ) String filename) throws Exception { //下载显示的文件名,解决中文名称乱码问题 filename= new String(filename.getBytes( "iso-8859-1" ), "UTF-8" ); //下载文件路径 String path = request.getServletContext().getRealPath( "/upload/" ); File file = new File(path + File.separator + filename); HttpHeaders headers = new HttpHeaders(); //下载显示的文件名,解决中文名称乱码问题 String downloadFielName = new String(filename.getBytes( "iso-8859-1" ), "UTF-8" ); //通知浏览器以attachment(下载方式)打开图片 headers.setContentDispositionFormData( "Content-Disposition" , downloadFielName); //application/octet-stream : 二进制流数据(最常见的文件下载)。 headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); return new ResponseEntity< byte []>(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED); } } |
4.实现上传文件的功能还需要在springmvc中配置bean:
1 2 3 4 5 6 7 8 9 10 11 |
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 上传文件大小上限,单位为字节(10MB) --> <property name="maxUploadSize"> <value>10485760</value> </property> <!-- 请求的编码格式,必须和jSP的pageEncoding属性一致,以便正确读取表单的内容,默认为ISO-8859-1 --> <property name="defaultEncoding"> <value>UTF-8</value> </property> </bean> |
完整代码如下:
up.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> < html > < head > < title >File控件</ title > </ head > < body > < form action = "doupload.jsp" enctype = "multipart/form-data" method = "post" > < p >上传者:< input type = "text" name = "user" ></ p > < p >选择文件:< input type = "file" name = "nfile" ></ p > < p >选择文件:< input type = "file" name = "nfile1" ></ p > < p >< input type = "submit" value = "提交" ></ p > </ form > </ body > </ html > |
doupload.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
<%@ page language="java" pageEncoding="UTF-8"%> <%@page import="java.io.*,java.util.*"%> <%@page import="org.apache.commons.fileupload.*"%> <%@page import="org.apache.commons.fileupload.disk.DiskFileItemFactory" %> <%@page import="org.apache.commons.fileupload.servlet.ServletFileUpload"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> < html > < head > < title >上传处理页面</ title > </ head > < body > <% request.setCharacterEncoding("utf-8"); String uploadFileName = ""; //上传的文件名 String fieldName = ""; //表单字段元素的name属性值 //请求信息中的内容是否是multipart类型 boolean isMultipart = ServletFileUpload.isMultipartContent(request); //上传文件的存储路径(服务器文件系统上的绝对文件路径) String uploadFilePath = request.getSession().getServletContext().getRealPath("upload/" ); if (isMultipart) { FileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); try { //解析form表单中所有文件 List< FileItem > items = upload.parseRequest(request); Iterator< FileItem > iter = items.iterator(); while (iter.hasNext()) { //依次处理每个文件 FileItem item = (FileItem) iter.next(); if (item.isFormField()){ //普通表单字段 fieldName = item.getFieldName(); //表单字段的name属性值 if (fieldName.equals("user")){ //输出表单字段的值 out.print(item.getString("UTF-8")+"上传了文件。< br />"); } }else{ //文件表单字段 String fileName = item.getName(); if (fileName != null && !fileName.equals("")) { File fullFile = new File(item.getName()); File saveFile = new File(uploadFilePath, fullFile.getName()); item.write(saveFile); uploadFileName = fullFile.getName(); out.print("上传成功后的文件名是:"+uploadFileName); out.print("\t\t下载链接:"+"< a href = 'download.action?name="+uploadFileName+"' >"+uploadFileName+"</ a >"); out.print("< br />"); } } } } catch (Exception e) { e.printStackTrace(); } } %> </ body > </ html > |
FileUploadController.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
package ssm.me.controller; import java.io.File; import java.net.URLDecoder; import java.util.Iterator; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileItemFactory; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.io.FileUtils; import org.junit.runners.Parameterized.Parameter; 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.ui.Model; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; @Controller public class FileUploadController { @RequestMapping (value= "/download" ) public ResponseEntity< byte []> download(HttpServletRequest request,HttpServletResponse response, @RequestParam ( "name" ) String filename) throws Exception { //下载显示的文件名,解决中文名称乱码问题 filename= new String(filename.getBytes( "iso-8859-1" ), "UTF-8" ); //下载文件路径 String path = request.getServletContext().getRealPath( "/upload/" ); File file = new File(path + File.separator + filename); HttpHeaders headers = new HttpHeaders(); //下载显示的文件名,解决中文名称乱码问题 String downloadFielName = new String(filename.getBytes( "iso-8859-1" ), "UTF-8" ); //通知浏览器以attachment(下载方式)打开图片 headers.setContentDispositionFormData( "Content-Disposition" , downloadFielName); //application/octet-stream : 二进制流数据(最常见的文件下载)。 headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); return new ResponseEntity< byte []>(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED); } } |
SpringMVC.xml(仅供参考,有的地方不可以照搬)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
<? xml version = "1.0" encoding = "UTF-8" ?> < beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc = "http://www.springframework.org/schema/mvc" xmlns:context = "http://www.springframework.org/schema/context" xmlns:aop = "http://www.springframework.org/schema/aop" xmlns:tx = "http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!-- 一个用于自动配置注解的注解配置 --> < mvc:annotation-driven ></ mvc:annotation-driven > <!-- 扫描该包下面所有的Controller --> < context:component-scan base-package = "ssm.me.controller" ></ context:component-scan > <!-- 视图解析器 --> < bean class = "org.springframework.web.servlet.view.InternalResourceViewResolver" ></ bean > < bean id = "multipartResolver" class = "org.springframework.web.multipart.commons.CommonsMultipartResolver" > <!-- 上传文件大小上限,单位为字节(10MB) --> < property name = "maxUploadSize" > < value >10485760</ value > </ property > <!-- 请求的编码格式,必须和jSP的pageEncoding属性一致,以便正确读取表单的内容,默认为ISO-8859-1 --> < property name = "defaultEncoding" > < value >UTF-8</ value > </ property > </ bean > </ beans > |
web.xml(仅供参考,有的地方不可以照搬)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
<? xml version = "1.0" encoding = "UTF-8" ?> < web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns = "http://java.sun.com/xml/ns/javaee" 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" > < display-name >Student</ display-name > < welcome-file-list > < welcome-file >index.html</ welcome-file > < welcome-file >index.htm</ welcome-file > < welcome-file >index.jsp</ welcome-file > < welcome-file >default.html</ welcome-file > < welcome-file >default.htm</ welcome-file > < welcome-file >default.jsp</ welcome-file > </ welcome-file-list > < servlet > < servlet-name >springmvc</ servlet-name > < servlet-class >org.springframework.web.servlet.DispatcherServlet</ servlet-class > <!-- 初始化参数 --> < init-param > < param-name >contextConfigLocation</ param-name > < param-value >classpath:springmvc.xml</ param-value > </ init-param > < load-on-startup >1</ load-on-startup > </ servlet > < servlet-mapping > < servlet-name >springmvc</ servlet-name > < url-pattern >*.action</ url-pattern > </ servlet-mapping > < context-param > < param-name >contextConfigLocation</ param-name > < param-value >classpath:spring/applicationContext-*.xml</ param-value > </ context-param > < listener > < listener-class >org.springframework.web.context.ContextLoaderListener</ listener-class > </ listener > </ web-app > |
以上便为文件上传和下载的全部代码,博主亲测过,没有问题。
2024-04-11
台式机电脑如何连接外接显示器2024-04-11
小新系列打印机手机配置网络的方法教程2024-04-11
Thinkpad 笔记本F1-F12快捷键分别是什么功能ThinkPad蓝牙鼠标如何配对解答步骤41U5008鼠标驱动官网地址: https://support.lenovo.com/en_US/downloads/detail.page?&LegacyDocID=MIGR-67201 第一种方式是比较传统的:使...
2024-04-11
故障现象: USB设备U盘、移动硬盘等插入后提示无法识别的设备,确认设备本身正常,设备可加电,或插入设备后加电但无任何反应,无法使用。新型号机器多表现为黄色USB接口存在此问题,...
2024-04-11