spring MVC 文件上传

参考博文:http://tzwzero-163-com.iteye.com/blog/1697184java

----------------------------------------如下是该文引用,红色部分是我添加了一句话---------------------------------web

必须明确告诉DispatcherServlet如何处理MultipartRequest。spring

SpringMVC中提供了文件上传使用方式以下apache

配置xxx-servlet.xml,添加以下代码:服务器

 

Xml代码  收藏代码mvc

<bean id="multipartResolver"  
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">  
        <!-- 设置上传文件的最大尺寸为1MB -->  
    <property name="maxUploadSize">  
        <value>1048576</value>  
    </property>  
</bean>

  注意这里的文件尺寸实际上只的是因此文件总大小app

若是配置了文件大小就觉得这你须要配置异常信息控制jsp

因此须要配置异常显示
spa

Xml代码  code

<!-- SpringMVC在超出上传文件限制时,会抛出org.springframework.web.multipart.MaxUploadSizeExceededException -->  
    <!-- 该异常是SpringMVC在检查上传的文件信息时抛出来的,并且此时尚未进入到Controller方法中 -->  
    <bean id="exceptionResolver"  
        class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">  
        <property name="exceptionMappings">  
            <props>  
                <!-- 遇到MaxUploadSizeExceededException异常时,自动跳转到/WEB-INF/jsp/error_fileupload.jsp页面 -->  
                <prop  
                    key="org.springframework.web.multipart.MaxUploadSizeExceededException">error_fileupload</prop>  
            </props>  
        </property>  
    </bean>

  或者偷懒点,不设置大小,则最终默认是值为不限制。若是非要控制返回信息,能够考虑在地应以的异常处理中返回指定格式数据,例如JSON

配置完了页面上一如既往的须要再form表单中增长:enctype="multipart/form-data"

而后就是须要处理的action了,能够有两种方式

第一种方式:

Java代码  收藏代码

public String login( @RequestParam MultipartFile file, Model model) {  
………………  
}

 

其中file的名字必须保证与<input type=file>中的那么属性值保持一致,若果是多文件上传,则考虑使用,多文件上传时各file名也必须一致,不然上传不成功

Java代码  

  public String login(@Valid UserInfo userInfo, BindingResult result, @RequestParam MultipartFile[] files, Model model) {  
………………  
}

单文件能够省略 @RequestParam 多文件则不可省略

第二种方式:

Java代码  收藏代码

 这样也能够获取到文件

public ModelAndView handleRequest(HttpServletRequest request,     
            HttpServletResponse response) throws Exception {     
        // 转型为MultipartHttpRequest:     
        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;     
        // 得到文件:     
        MultipartFile file = multipartRequest.getFile(" file ");    
    }

其实刚才首先须要配置是加入两个 jar包:

commons-fileupload-1.2.2.jar

commons-io-2.1.jar

--------------------------------------------------引用结束--------------------------------------------------------------------------

//No.1 本方法是文件+文本域等混合的上传
@RequestMapping("/upload-mvc-txt.do")
    public String handleFormUpload(@RequestParam MultipartFile[] file1, HttpServletRequest request) {

        String path = request.getSession().getServletContext().getRealPath("/") + "/upload/";
        for(MultipartFile ufile : file1){
            if (!ufile.isEmpty()) {
                System.out.println(path);
                File file = new File(path + new Date().getTime() + ".jpg"); //服务器上新建文件
                try {
                    FileUtils.copyInputStreamToFile(ufile.getInputStream(), file);
                    Thread.sleep(1000);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

        String uname = request.getParameter("user_name");
        System.out.println(uname);
        return "success";
    }

    @RequestMapping("/upload-mvc.do")
    public String handleFormUpload(MultipartFile file1, HttpServletRequest request) { //请求参数必定要与form中的参数名对应
        System.out.println(file1.getSize());
        if (!file1.isEmpty()) {
            String path = request.getSession().getServletContext().getRealPath("/") + "/upload/";
            System.out.println(path);
            File file = new File(path + new Date().getTime() + ".jpg"); //新建一个文件
            try {
                FileUtils.copyInputStreamToFile(file1.getInputStream(), file);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return "success"; //返回成功视图
        }else {
            return "error"; //返回失败视图
        }
    }


    /**
     * 非 spring MVC 方式,即便用了普通的servlet的方式,若是使用了springMVC(需在xml中配置)
     * 此方法将不能正确的上传文件,缘由是spring mvc会把request从新封装,导致fileUpload.parseRequest(request);
     * 返回的list为空。(去掉响应配置便可使用本方法)
     * @param request
     * @param response
     * @return
     */
    @RequestMapping("/upload.do")
    public String upPic(HttpServletRequest request, HttpServletResponse response) {
        String appPath = request.getSession().getServletContext().getRealPath("/");
        try{
            //判断Form是否为 multipart form
            boolean isMultipart = ServletFileUpload.isMultipartContent(request);
            if(isMultipart){
                FileItemFactory fileItemFactory = new DiskFileItemFactory();//设置工厂

                ServletFileUpload sfu = new ServletFileUpload(fileItemFactory);

                //这里就是中文文件名处理的代码,其实只有一行,setHeaderEncoding就能够了
                sfu.setHeaderEncoding("utf-8");

                List fileItemList = sfu.parseRequest(request);//解析上传文件数据包

                for(int i=0;i<fileItemList.size();i++){
                    FileItem fileItem = (FileItem)fileItemList.get(i);//遍历每一个上传文件

                    if(!fileItem.isFormField()){//判断是否是上传的文件
                        String fullFileName = fileItem.getName();//文件全名
                        String fileName = getFileName(fullFileName);//文件名
                        //设置文件存储在服务器上的路径
                        String path = appPath + "/upload";
                        if(!new File(path).isDirectory())//若是不存在,则建立目录
                            new File(path).mkdirs();
                        File file = new File(path, fileName);
                        fileItem.write(file);
                        System.out.println("上传第" + i + "个文件");
                    }
                }
            }
        }catch(Exception e){
            e.printStackTrace();
        }
        return "success";
    }

Spring MVC 对文件上传的支持和与apache-commons的两个组件的结合仍是很方便的,以上仅仅完成基本的上传功能,其余的细节和特性还有待进一步的尝试。

相关文章
相关标签/搜索