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

    [From] http://my.oschina.net/u/1394615/blog/311307


    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 ”   成功了 !!!

    jar 包在  oschina 这里不知道怎么上传过去给下载的。。同学们自己网上找吧! 


  • 相关阅读:
    Leetcode练习(Python):链表类:第206题:反转链表:反转一个单链表。
    Leetcode练习(Python):链表类:第203题:移除链表元素:删除链表中等于给定值 val 的所有节点。
    Leetcode练习(Python):链表类:第160题:相交链表:编写一个程序,找到两个单链表相交的起始节点。
    Leetcode练习(Python):链表类:第141题:环形链表:给定一个链表,判断链表中是否有环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
    Leetcode练习(Python):链表类:第83题:删除排序链表中的重复元素:给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
    【Java基础总结】数据库编程
    【Java基础总结】多线程
    特迷茫的大三时期
    解决忘记了开机密码,无法进入系统的方法
    一开机未通过输入密码登录,就出现用户名或密码错误??
  • 原文地址:https://www.cnblogs.com/pekkle/p/6568679.html
Copyright © 2011-2022 走看看