zoukankan      html  css  js  c++  java
  • Strut2 和Spring MVC 文件上传对比

    在Java领域中,有两个常用的文件上传项目:一个是Apache组织Jakarta的Common-FileUpload组件
    (http://commons.apache.org/proper/commons-fileupload/),另一个是Oreilly组织的COS框架的

     1.Struts2的文件上传

    Struts2本身并没提供上传的组件,我们可以通过调用上传框架来实现文件的上传,struts2默认是jakarta作为其文件上传的解析器。

     jakarta是Commo-FileUpload的框架。如果要使用Commo-FileUpload框架来上传文件,只需将"commons-fileupload-1.2.1.jar"

    和"commons-io-1.3.2.jar"两个jar复制到项目中的WEB-INF/lib目录下就可。我们这里上传就是基于Commo-FileUpload框架实现的。

    首先我们建立一个上传的JSP页面:

    <%@ 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="pragma" content="no-cache">  
        <meta http-equiv="cache-control" content="no-cache">  
        <meta http-equiv="expires" content="0">       
    <title>文件上传</title>  
    </head>  
    <body>  
    <form action="upload.action" method="post" enctype="multipart/form-data">  
    
      <input type="file" name="file" /> 
      <input type="submit" value="Submit" />
    
    </form>  
    </body>  
    </html>

    下面我们顺便介绍一下from 中enctype属性的含义:

     表单元素的enctype属性指定的是表单数据的编码方式,该属性有3个值:
      1) application/x-www-form-urlencoded:这是默认编码方式,它只处理表单域里的value属性值,采用这种编码方式的表单会将表单域的
    值处理成URL编码方式。
      2) multipart/form-data:这种编码方式的表单会以二进制流的方式来处理表单数据,这种编码方式会把文件域指定文件的内容也封装到
    请求参数里。
      3) text/plain:这种方式主要适用于直接通过表单发送邮件的方式。
      文件上传是原理是通过为表单元素设置enctype=”multipart/form-data”属性,让表单提交的数据以二进制编码的方式提交,
          在接收此请求的Servlet中用二进制流来获取内容,就可以取得上传文件的内容,从而实现文件的上传。
     
    在我们建立upload.action之前先对struts.xml进行相应的设置,如下所示:
        <constant name="struts.multipart.maxSize" value="10701096"/>
        <!-- 设置上传文件的临时文件夹,默认使用javax.servlet.context.tempdir -->
        <constant name="struts.multipart.saveDir " value="c:/temp" />
        <!--静态属性设置添加以上设置-->
        
        <package name="upload" extends="struts-default">
            <action name="upload" class="com.test.action.UploadAction" method="execute">
                <!-- 动态设置savePath的属性值 -->
                <param name="savePath">/upload</param>
                <result name="success">/WEB-INF/success.jsp</result>
                <result name="input">/upload.jsp</result>
                <interceptor-ref name="fileUpload">
                    <!-- 文件过滤 -->
                    <param name="allowedTypes">image/bmp,image/png,image/gif,image/jpeg</param>
                    <!-- 文件大小, 以字节为单位 -->
                    <param name="maximumSize">1025956</param>
                </interceptor-ref>
                <!-- 默认拦截器必须放在fileUpload之后,否则无效 -->
                <interceptor-ref name="defaultStack" />
            </action>
        </package>

    Upload.action:

    public class UploadAction extends ActionSupport {
    private File file;//对应文件域和页面中file input的name保持一致 private String fileContentType;//前面的File属性的名字 + ContentType(固定的) private String fileFileName;//前面的File属性的名字 + FileName(固定的) private String savePath;//保存路径 @Override public String execute() { FileOutputStream fos = null; FileInputStream fis = null; try { // 建立文件输出流 fos = new FileOutputStream(getSavePath() + "\" + getFileFileName()); // 建立文件上传流 fis = new FileInputStream(getFile()); byte[] buffer = new byte[1024]; int len = 0; while ((len = fis.read(buffer)) > 0) { fos.write(buffer, 0, len); } } catch (Exception e) { System.out.println("文件上传失败"); e.printStackTrace(); } finally { fis.close(); fos.close(); } return SUCCESS; } /** * 返回上传文件的保存位置 * * @return */ public String getSavePath() throws Exception{ return ServletActionContext.getServletContext().getRealPath(savePath); } public void setSavePath(String savePath) { this.savePath = savePath; } public File getFile() { return file; } public void setFile(File file) { this.file = file; } public String getFileContentType() { return fileContentType; } public void setFileContentType(String fileContentType) { this.fileContentType = fileContentType; } public String getFileFileName() { return fileFileName; } public void setFileFileName(String fileFileName) { this.fileFileName = fileFileName; } }

    最后顺便说一下上传多个文件,主要有以下两种方式:

    1.数组

    File[] file 文件
    String[] fileFileName 文件名
    String[] fileContentType 文件类型

    2.集合

    List<File> file 
    List<String> fileFileName
    List<String> fileContentType

     2.SpringMVC的文件上传

    个人认为Spring mvc的文件上传要比struts2要方便多了。Spring mvc 支持web应用程序的文件上传功能,是由Spring内置的即插即用的MultipartResolver来实现的,

    上传的时候就需要在Spring的ApplicationContext里面加上SpringMVC提供的MultipartResolver的声明。这样之后,客户端每次进行请求的时候,

    SpringMVC都会检查request里面是否包含多媒体信息,如果包含了就会使用MultipartResolver进行解析,SpringMVC会使用一个支持文件处理的

    MultipartHttpServletRequest来包裹当前的HttpServletRequest然后使用MultipartHttpServletRequest就可以对文件进行处理了。

    Spring MVC已经为我们提供了一个MultipartResolver的实现,我们只需要拿来用就可以了,那就是org.springframework.web.multipart.commons.CommsMultipartResolver。因为springMVC的MultipartResolver底层使用的是Commons-fileupload,所以还需要加入对Commons-fileupload.jar的支持。
    首先我们还是要建立一个上传页面:
     
    <%@ 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="pragma" content="no-cache">  
        <meta http-equiv="cache-control" content="no-cache">  
        <meta http-equiv="expires" content="0">       
    <title>文件上传</title>  
    </head>  
    <body>  
    <form action="upload.do" method="post" enctype="multipart/form-data">  
    
      <input type="file" name="file" /> 
      <input type="submit" value="Submit" />
    
    </form>  
    </body>  
    </html>

     然后我们在SpringMVC的applicationContent配置文件中加入以下设置:

        <!-- 上传文件 -->
        <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="defaultEncoding" value="utf-8" /> 
        <!-- 以字节为单位的最大上传文件的大小 -->  
        <property name="maxUploadSize" value="100000" /> 
        </bean>

    CommonsMultipartResolver允许设置的属性有:
        defaultEncoding:表示用来解析request请求的默认编码格式,当没有指定的时候根据Servlet规范会使用默认值ISO-8859-1。

        当request自己指明了它的编码格式的时候就会忽略这里指定的defaultEncoding。

        uploadTempDir:设置上传文件时的临时目录,默认是Servlet容器的临时目录。
        maxUploadSize:设置允许上传的最大文件大小,以字节为单位计算。当设为-1时表示无限制,默认是-1。
        maxInMemorySize:设置在文件上传时允许写到内存中的最大值,以字节为单位计算,默认是10240。

      创建一个controller(控制器)来处理文件上传请求,FileUploadController.java:

      实现上传的方法如下:

    @RequestMapping( value="/upload.do",method = { RequestMethod.POST })
    public ModelAndView upload(@RequestParam(value = "file", required = false) MultipartFile file,HttpServletRequest request) {
    System.out.println("开始"); String path = request.getSession().getServletContext().getRealPath("upload");//上传的目录 String fileName = file.getOriginalFilename();//上传的文件名字 System.out.println(path); File targetFile = new File(path, fileName); if (!targetFile.exists()) { targetFile.mkdirs(); } // 保存 try { file.transferTo(targetFile); } catch (Exception e) { e.printStackTrace(); } return new ModelAndView("result"); }

    到此 SpringMVC的上传也结束了,要比Struts2要简单多了吧。

  • 相关阅读:
    通过避免下列 10 个常见 ASP.NET 缺陷使网站平稳运行 from MSDN
    编写自己的dojo扩展zt
    Adding an IE7 Browser Template for use by Web Tests
    MAC地址与IP地址绑定策略的破解zt
    .net 中string 的应用特点(转贴)让我豁然开朗
    全国最佳医院排名(供参考)
    小心你的Page_Load重复执行(转贴)
    A780知识总汇zt
    [Quoted] Writing HighPerformance Managed Applications : A Primer
    [网络摘录学习]常用的Linux系统监控命令
  • 原文地址:https://www.cnblogs.com/heshan664754022/p/3259332.html
Copyright © 2011-2022 走看看