zoukankan      html  css  js  c++  java
  • 用SpringMVC实现的上传下载方式二(多文件上传)

     参考来源:      http://blog.csdn.net/qq_32953079/article/details/52290208

    1、导入相关jar包

    commons-fileupload.jar

    commons-io.jar

    2、配置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>SpringMVC_fileUpLoad</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>
      
      	<filter>
    		<filter-name>encodingFilter</filter-name>
    		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    		<init-param>
    			<param-name>encoding</param-name>
    			<param-value>UTF-8</param-value>
    		</init-param>
    	</filter>
    	<filter-mapping>
    		<filter-name>encodingFilter</filter-name>
    		<url-pattern>/*</url-pattern>
    	</filter-mapping>
    	
    	<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-servlet.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>
    	
    </web-app>

    3、编写上传页面

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    <h1>多文件上传</h1>
    <form action="upload.action" method="post"enctype="multipart/form-data">
    	<input type="file" name="pic" /><br/>
    	<input type="file" name="pic" /><br/>
    	<input type="file" name="pic" /><br/>
    	<input type="file" name="pic" /><br/>
    	<input type="submit" value="上传" />
    </form>
    </body>
    </html>

    4、配置springmvc-servlet.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:aop="http://www.springframework.org/schema/aop" 
    	xmlns:tx="http://www.springframework.org/schema/tx" 
    	xmlns:context="http://www.springframework.org/schema/context" 
    	xmlns:c="http://www.springframework.org/schema/c"
    	xmlns:cache="http://www.springframework.org/schema/cache"
    	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
    		http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-4.0.xsd
    		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
    		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
    		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
    	
    	<context:component-scan base-package="com.etc"></context:component-scan>
    	
    	<bean id="fileUpLoadController" class="com.etc.fileupload.FileUpLoadController"/>
    	
       <!-- 文件上传的配置               CommonsMultipartResolver公共上传解析器 -->  
       <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">     
           <!-- 指定所上传文件的总大小不能超过200KB。注意maxUploadSize属性的限制不是针对单个文件,而是所有文件的容量之和 -->     
           <!-- <property name="maxUploadSize" value="200000"/>    出错原因1:图片大小限制-->  
           <property name="maxUploadSize" value="10240000"/>     
       </bean>     
           
       <!-- 该异常是SpringMVC在检查上传的文件信息时抛出来的,而且此时还没有进入到Controller方法中 -->     
       <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">     
           <property name="exceptionMappings">     
               <props>     
                   <!-- 遇到MaxUploadSizeExceededException异常时,自动跳转到WebContent目录下的error.jsp页面 -->     
                   <prop key="org.springframework.web.multipart.MaxUploadSizeExceededException">error.jsp</prop>     
               </props>     
           </property>  
    	</bean>	
    </beans>

    5、编写handler处理器

    package com.etc.fileupload;
    /**
     * 上传和下载的区别:
     * 上传是将文件上传到服务器中,而下载是将服务器中的文件下载到本地环境中
     * 
     * 回去后,用自己电脑作为服务器,其他电脑作为用户电脑,在尝试一下连接
     *       查看上传到服务端的地址以及下载时客户端的地址,
     *       request.getServletContext().getRealPath("/img")貌似是请求的客户端地址,回去在研究下
     */
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.commons.io.FileUtils;
    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.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.multipart.MultipartFile;
    
    @Controller
    public class FileUpLoadController {
    
    	/**
    	 * 多文件上传
    	 * @param pic
    	 * @param model
    	 * @param request
    	 * @return
    	 * @throws IOException
    	 */
    	@RequestMapping("/upload.action")
    	public String UpLoad(@RequestParam MultipartFile[] pic,Model model,HttpServletRequest request) throws IOException{
    		System.out.println("upload.action进来了!"); 
    		List<String> list=new ArrayList<String>();
    		for(MultipartFile file:pic){
    			//此处MultipartFile[]表明是多文件,如果是单文件MultipartFile就行了
    			if(pic==null||file.isEmpty()){
    				System.out.println("文件未上传!");
    			}else{
    				//得到上传的文件名
    				String filename=file.getOriginalFilename();
    				System.out.println("文件名:    "+filename);
    				//得到服务器项目发布运行所在地址                     //出错问题二:请求地址时,要看是什么层次的请求,request和session是不同的
                    String pmpath =request.getServletContext().getRealPath("/img")+File.separator; 
                    //String pmpath=request.getServletContext().getRealPath("/img")+ File.separator + filename;
    				System.out.println("服务器项目发布所在地址:   "+pmpath);
    				
    				//此处未使用UUID来生成唯一标识(这也是正常下载的图片是很多数字命名的原因),用日期做为标识  (过会做一下)
                    String path = pmpath + filename;  /*new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())+*/ 
                    //String path = UUID.randomUUID().toString(); 
                    ////查看文件上传路径,方便查找  
                    System.out.println("完整的文件上传后,保存所在的路径:  "+path);
                    //将每一个文件名保存到list集合中
                    list.add(filename);
                    //list.add(path);
                    
                    //把文件上传至path的路径 
                    File localFile=new File(path);
                    file.transferTo(localFile);
    			}
    		}
    		model.addAttribute("filenameList",list);
    		return "uploadSuccess.jsp";		
    	}
    	
    	/**
    	 * 文件下载实现方式一
    	 * @param r
    	 * @param filename
    	 * @return
    	 * @throws IOException
    	 */
    	@RequestMapping("/down.action")
    	public ResponseEntity<byte[]> downFile(HttpServletRequest r,String filename) throws IOException{
    		//配置http请求头文件信息
    		
    		HttpHeaders headers = new HttpHeaders(); 
    		String path=r.getServletContext().getRealPath("/img")+ File.separator + filename;
    		
    		File file=new File(path);
    		     
    	    headers.setContentDispositionFormData("attachment",filename);//不自动打开 
    	    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);   //头文件内容类型
    	    return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),    
    	                                       headers, HttpStatus.CREATED);   
    	}
    	/**
    	 * 文件下载实现方式二
    	 * @param fileName
    	 * @param request
    	 * @param response
    	 * @return
    	 */
    	@RequestMapping("/download2.action")  
        public String download(String fileName, HttpServletRequest request,  
                HttpServletResponse response) {  
            response.setCharacterEncoding("utf-8");  
            response.setContentType("multipart/form-data");  
            response.setHeader("Content-Disposition", "attachment;fileName="  
                    + fileName);  
            try {  
                String path = request.getSession().getServletContext().getRealPath  
                        ("image")+File.separator;  
                InputStream inputStream = new FileInputStream(new File(path  
                        + fileName));  
      
                OutputStream os = response.getOutputStream();  
                byte[] b = new byte[2048];  
                int length;  
                while ((length = inputStream.read(b)) > 0) {  
                    os.write(b, 0, length);  
                }  
                 // 这里主要关闭。  
                os.close();  
      
                inputStream.close();  
            } catch (FileNotFoundException e) {  
                e.printStackTrace();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
                //  返回值要注意,要不然就出现下面这句错误!  
                //java+getOutputStream() has already been called for this response  
            return null;  
        }  
    }

    6、编写下载页面

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>    
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    <style>
    	div{
    		float: left;
    	}
    	
    </style>
    </head>
    <body>
    	<h1>图片上传成功</h1>
        <!-- 图片显示问题解决,服务器上不能写绝对地址,也不能加/img这种格式,应该是img/这种格式,看看图片重复怎么解决-->
    	<div style="600px">
    	<c:forEach items="${filenameList}" var="fname">
    		<div style="200px">
    			<img src="img/${fname}" width="200px"/>
    		</div>
    	</c:forEach>
    	</div>
    	<%-- <a href="down.action?filename=${filename}">下载</a> --%>
    </body>
    </html>

     

      

      

      

  • 相关阅读:
    OSG-提示“error reading file e:1.jpg file not handled”
    OSG-加载地球文件报0x00000005错误,提示error reading file simple.earth file not handled
    QT-找开工程后,最上方提示the code model could not parse an included file, which might lead to incorrect code completion and highlighting, for example.
    我的书《Unity3D动作游戏开发实战》出版了
    java中无符号类型的第三方库jOOU
    Windows批处理备份mysql数据
    使用 DevTools 时,通用Mapper经常会出现 class x.x.A cannot be cast to x.x.A
    Java版本,Java版本MongoDB驱动,驱动与MongoDB数据库,Spring之间的兼容性
    Jrebel本地激活方法
    wget下载指定网站目录下的所有内容
  • 原文地址:https://www.cnblogs.com/1020182600HENG/p/6907493.html
Copyright © 2011-2022 走看看