Java实现上传(支持多个文件同时上传)和下载

首先给大家推荐一下我老师大神的人工智能教学网站。教学不仅零基础,通俗易懂,而且非常风趣幽默,还时不时有内涵黄段子!点这里可以跳转到网站

文件上传一直是Web项目中必不可少的一项功能。

项目结构如下:(这是我之前创建的SSM整合的框架项目,在这上面添加文件上传与下载)

主要的是FileUploadController,doupload.jsp,up.jsp,springmvc.xml

1.先编写up.jsp

<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

<%	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实现文件下载的功能(相对上传比较简单):

@Controllerpublic 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:

<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

<%@ 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

<%@ 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

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;  @Controllerpublic 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(仅供参考,有的地方不可以照搬)

<?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(仅供参考,有的地方不可以照搬)

<?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>

以上变为文件上传和下载的全部代码,博主亲测过,没有问题。

点这里可以跳转到人工智能网站

发表评论