zoukankan      html  css  js  c++  java
  • SpringMVC实现上传和下载

    摘要

    有些下载的错误解决来 java.lang.IllegalStateException: getOutputStream() has already been called for this response 解决的答案: http://www.360doc.com/content/12/0612/13/1967709_217660151.shtml 还有就是主要根据 李守红老师 的上传来做的。
    package com.pk.web.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.multipart.MultipartFile;
    import org.springframework.web.multipart.MultipartHttpServletRequest;
    import org.springframework.web.multipart.commons.CommonsMultipartResolver;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import java.io.*;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Iterator;
    
    /**
     * Created by Administrator on 2014/9/5.
     */
    @Controller
    @RequestMapping("file")
    public class UploadController {
    	@RequestMapping("/upload.do")
    	public String upload(HttpServletRequest request,
    			HttpServletResponse response) throws IOException {
                   // 这里我用到了jar包
    		CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(
    				request.getSession().getServletContext());
    		if (multipartResolver.isMultipart(request)) {
    			MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
    
    			Iterator<String> iter = multiRequest.getFileNames();
    			while (iter.hasNext()) {
    				MultipartFile file = multiRequest.getFile((String) iter.next());
    				if (file != null) {
    					String fileName = file.getOriginalFilename();
    
    					String path1 = Thread.currentThread()
    							.getContextClassLoader().getResource("").getPath()
    							+ "download" + File.separator;
    
    					//  下面的加的日期是为了防止上传的名字一样
    					String path = path1
    							+ new SimpleDateFormat("yyyyMMddHHmmss")
    									.format(new Date()) + fileName;
    
    					File localFile = new File(path);
    
    					file.transferTo(localFile);
    				}
    
    			}
    
    		}
    		return "uploadSuccess";
    
    	}
    	@RequestMapping("/toUpload.do")
    	public String toUpload() {
    		return "upload";
    	}
    
    	@RequestMapping("/download")
    	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 = Thread.currentThread().getContextClassLoader()
    					.getResource("").getPath()
    					+ "download";//这个download目录为啥建立在classes下的
    			InputStream inputStream = new FileInputStream(new File(path
    					+ File.separator + 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;
    	}
    }

    还有 上传 配置文件注意

        <!-- mvc注解驱动 -->

        <mvc:annotation-driven/>

        <!-- 扫描器已经有了上面这个mvc注解驱动的功能了,所有不需要了 -->

        <context:component-scan base-package="com.pk.web.controller" />

        <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

            <property name="defaultEncoding" value="utf-8" />

            <property name="maxUploadSize" value="104857600"/>

            <property name="maxInMemorySize" value="4096"/>

        </bean>

        <!-- 前缀+ viewName +后缀 -->

        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

            <!-- webroot到某一指定的文件夹的路径 -->

            <property name="prefix" value="/WEB-INF/jsp/"></property>

          <!--  自己在你的 /WEB-INF/jsp下建立给jsp见面吧。或者该我上面的配置 -->

            <!-- 视图名称的后缀 -->

            <property name="suffix" value=".jsp"></property>

        </bean>

    这里是html 点击下载,这里就写死了(你可以修改成你自己放的文件)。可以修改的。

      <a href="file/download.do?fileName=map.txt">下载1 </a><br />

    下面这里是上传代码

       <form action="file/upload.do" method="post" enctype="multipart/form-data">

                选择文件<input type="file" name="file">

                <input type="submit" value="上传">

            </form>

    web.xml 配置文件

    <servlet>

            <servlet-name>springmvc</servlet-name>

            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

            <load-on-startup>1</load-on-startup>

        </servlet>

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

            <init-param>

                <param-name>forceEncoding</param-name>

                <param-value>true</param-value>

            </init-param>

        </filter>

        <filter-mapping>

            <filter-name>encodingFilter</filter-name>

            <url-pattern>/*</url-pattern>

        </filter-mapping>

        <servlet-mapping>

            <servlet-name>springmvc</servlet-name>

            <!-- struts习惯使用/*,在springmvc不管用 -->

            <url-pattern>*.do</url-pattern>

        </servlet-mapping>



    每个方法都返回的是一个ActionForward对象,而response是ActionForward对象参数,所以就会使response冲突! 
    所以处理上传的action返回null就可以了

    最终我把action里的最后 “return SUCCESS ” 改成了 “return null ”   成功了 !!!

  • 相关阅读:
    Android 应用程序集成FaceBook 登录及二次封装
    Android MVP 设计模式
    java 接口的作用和好处
    Android版本和API Level对应关系
    Android 开源库和项目 2
    高效开发iOS系列 -- 那些不为人知的KVC
    HDU 1019 Least Common Multiple 数学题解
    程序猿喜欢如何的职位描写叙述?
    从零開始搭建微信硬件开发环境全过程——1小时掌握微信硬件开发流程
    Spring ORM数据訪问——Hibernate
  • 原文地址:https://www.cnblogs.com/jxldjsn/p/5671532.html
Copyright © 2011-2022 走看看