jquery ajax+spring mvc上传文件

简介: jquery ajax+spring mvc上传文件

导入commons-fileupload-1.2.2.jar和commons-io-2.4.jar及spring的一些jar包

创建上传处理类UploadAction

package com.mysite.test;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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;
@Controller
public class UploadAction {
  private static final Logger logger = LoggerFactory.getLogger(UploadAction.class);
  private final static int maxSize = 209715200;// 1024*1024*200 (200M)
  private String filePath="/uploads/";
  @RequestMapping(value = "/upload.do")
  public void fileUpload(HttpServletRequest request, HttpServletResponse response) {
    CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
    multipartResolver.setDefaultEncoding("UTF-8");
    if (multipartResolver.isMultipart(request)) {
      StringBuffer result = new StringBuffer();
      long startTime = System.currentTimeMillis(); // 获取开始时间
      MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
      Iterator<String> ite = multiRequest.getFileNames();
      response.setCharacterEncoding("UTF-8");
      PrintWriter writer = null;
      try {
        writer = response.getWriter();
        while (ite.hasNext()) {
          MultipartFile file = multiRequest.getFile(ite.next());
          if (file.getSize() > maxSize) {
            result.append("文件[" + file.getOriginalFilename() + "]的大小超过限制(200M)").append("\r\n");
            writer.print(result);
            writer.flush();
            return;
          }
          if (file != null) {
            try {
              File serverPath = new File(filePath);
              if (!serverPath.exists()) {
                logger.warn("The path of server save file is not exists!");
                serverPath.mkdirs();
              }
              if (!serverPath.isDirectory()) {
                logger.warn("The path of server save file is not directory!");
                return;
              }
              if (!serverPath.canWrite() || !serverPath.canRead()) {
                logger.warn("The path of server save file cannot write or cannot read!");
                serverPath.setReadable(true);
                serverPath.setWritable(true);
              }
              File localFile = new File(filePath + file.getOriginalFilename());
              if (localFile.isFile() && localFile.exists()) {
                String name = localFile.getName();
                String oldName = name.substring(0, name.lastIndexOf(".")) + "_" + System.currentTimeMillis() + "_old" + name.substring(name.lastIndexOf("."));
                FileUtils.copyFile(localFile, new File(filePath + oldName));
                FileUtils.forceDelete(localFile);
              }
              file.transferTo(localFile); // 将上传文件写到服务器上指定的文件
              long endTime = System.currentTimeMillis(); // 获取结束时间
              logger.info("upload file success!expend {} ms", (endTime - startTime));
              String filePath = localFile.getAbsolutePath();
              logger.info("the file save to:{}", filePath);
              result.append("The file [").append(file.getOriginalFilename()).append("] upload success!\n");
            } catch (IOException e) {
              logger.error("has a error:{}", e);
            }
          }
        }
        writer.print(result);
        writer.flush();
      } catch (IOException e1) {
        e1.printStackTrace();
      } finally {
        if (writer != null) {
          writer.close();
        }
      }
    }
  }
}


在springmvc-servlet.xml配置上传属性

<!-- 文件上传解析器 -->  
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">  
    <property name="defaultEncoding" value="utf-8"></property>  
    <property name="maxUploadSize" value="209715200"></property><!-- 最大上传文件大小 200M-->  
    <property name="maxInMemorySize" value="40960"></property>  
</bean>

jsp导入js类库,因为样式是使用的easyui,所有需要引入easyui的js及样式

<script type="text/javascript" src="${base}js/jquery-1.8.3.min.js"></script>
<script type="text/javascript" src="${base}js/ajaxFileUpload.js"></script>
<script type="text/javascript" src="${base}js/jquery.easyui.min.js"></script>


导入样式文件

<link rel="stylesheet" type="text/css" href="${base}css/easyui.css">
<link rel="stylesheet" type="text/css" href="${base}css/icon.css">
<link rel="stylesheet" type="text/css" href="${base}css/color.css">
<link rel="stylesheet" type="text/css" href="${base}css/demo.css">

css

.aitem {margin: 10px 0 5px 0;padding-bottom: 5px;border-bottom: 1px solid #eee;}
.aitem .item {height: 40px;line-height: 40px;vertical-align: middle;}
.aitem span {padding-right: 5px;}
.aitem .title {width: 120px;}
.aitem input[type="text"],input[type="password"],input[type="file"] {width: 200px;}
/*a  upload */
.a-upload {
text-decoration:none;
    padding: 2px 10px;
    height: 20px;
    line-height: 20px;
    position: relative;
    cursor: pointer;
    color: #777;
    background: #eee;
    border: 1px solid #ddd;
    border-radius: 4px;
    overflow: hidden;
    display: inline-block;
    *display: inline;
    *zoom: 1
}
.a-upload  input {
    position: absolute;
    width:100%;
    right: 0;
    top: 0;
    opacity: 0;
    filter: alpha(opacity=0);
    cursor: pointer
}
.a-upload:hover {color: #444;background: #eee;border-color: #ccc;text-decoration: none;}
#fileName{color: #444;height: 24px;line-height: 24px;overflow: hidden;display: inline-block;*display: inline;*zoom: 1}


jsp

<div id="dlg" class="easyui-dialog" data-options="buttons:'#dlg-buttons',modal:true,closed:true" style="width:450px;height:330px;">
    <form id="fm" name="fm" method="post" novalidate enctype="multipart/form-data">
        <div id="uploadfile" class="aitem" style="display:block;">
            <label><span style="color:red;">*</span>需更新的文件 (文件格式:zip,tar,jar,properties,bat,sh)</label>
            <div class="item" style="height: 45px">
                    <a href="javascript:;" class="a-upload">
                        <input type="file" name="file" id="file" οnchange="change(event);">选择文件
                    </a>
                    <span id="fileName"></span>
            </div>
            <label>文件最大不能超过200M</label>
        </div>
    </form>
</div>
<div id="dlg-buttons">
    <button class="easyui-linkbutton c6" id="confirm" style="width:80px">确定</button>
    <button class="easyui-linkbutton c5"  οnclick="closeDialog('dlg')" style="width:80px">关闭窗口</button>
</div>




编写js函数

//上传文件,点击选择文件后获取文件名&文件大小
function change(event){
    event.stopPropagation();
    var src=event.target || window.event.srcElement; //获取事件源,兼容chrome/IE
    //alert( src.value );
    //测试chrome浏览器、IE6,获取的文件名带有文件的path路径
    //下面把路径截取为文件名
    var path=src.value;
    if(!path){
        return false;
    }
    var filename=path.substring( path.lastIndexOf('\\')+1 );
    //获取文件名的后缀名(文件格式)
    var suffix=path.substring( path.lastIndexOf('.')+1 );
    //zip,tar,jar,properties,bat,sh
    if(suffix.toLowerCase()!="zip"&&suffix.toLowerCase()!="tar"&&suffix.toLowerCase()!="jar"&&suffix.toLowerCase()!="properties"
        &&suffix.toLowerCase()!="bat"&&suffix.toLowerCase()!="sh"){
        $.messager.alert("警告","只能上传以下后缀名的文件\nzip,tar,jar,properties,bat,sh");
        //$("input[name='file']").val("");
        src.value="";
        if(src.id=='file')$("#fileName").empty();
        else $("#selfFileName").empty();
        return false;
    }
    var file_size = 0;
    if ($.browser.msie) {
        var img = new Image();
        img.src = path;
        file_size = img.fileSize;
    } else {
        file_size = src.files[0].size;
    }
    var size = file_size / 1024;
    var maxSize = 200*1024;//200M
    if (size > maxSize) {
        $.messager.alert("警告","只能上传200M以下的文件");
        src.value="";
        if(src.id=='file')$("#fileName").empty();
        else $("#selfFileName").empty();
        return false;
    }
    if(src.id=='file')$("#fileName").empty().text(filename);
    else $("#selfFileName").empty().text(filename);
    return true;
};
//确认上传按钮绑定事件
$("#confirm").bind("click", function(event) {
    var file=$("input[name='file']").val();
    $.messager.confirm("确认","你确定要这次操作吗?", function (r) {
        if (r) {
            if(!file){
                $.messager.alert("警告","请选择需要上传的文件!","warning");
                return false;
            }
            var command='1';
            $.ajaxFileUpload({  
                fileElementId: 'file',  
                url: 'upload.do',  
                data : {
                    /*command : command*///传参数
                },
                dataType: 'text',
                success: function (data, status) {  
                  if (status == "success") {
                        $.messager.alert("",data);
                    }
                },  
                error: function (XMLHttpRequest, status, error) {  
                    var msg = "服务器返回消息:" + XMLHttpRequest.responseText;  
                    $.messager.alert('提示',msg);  
                },  
                complete: function (obj) {
                }  
           });
        }
    });
});




co

cor

相关文章
|
2月前
|
前端开发 Java 微服务
《深入理解Spring》:Spring、Spring MVC与Spring Boot的深度解析
Spring Framework是Java生态的基石,提供IoC、AOP等核心功能;Spring MVC基于其构建,实现Web层MVC架构;Spring Boot则通过自动配置和内嵌服务器,极大简化了开发与部署。三者层层演进,Spring Boot并非替代,而是对前者的高效封装与增强,适用于微服务与快速开发,而深入理解Spring Framework有助于更好驾驭整体技术栈。
|
9月前
|
前端开发 Java 测试技术
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestParam
本文介绍了 `@RequestParam` 注解的使用方法及其与 `@PathVariable` 的区别。`@RequestParam` 用于从请求中获取参数值(如 GET 请求的 URL 参数或 POST 请求的表单数据),而 `@PathVariable` 用于从 URL 模板中提取参数。文章通过示例代码详细说明了 `@RequestParam` 的常用属性,如 `required` 和 `defaultValue`,并展示了如何用实体类封装大量表单参数以简化处理流程。最后,结合 Postman 测试工具验证了接口的功能。
552 0
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestParam
|
9月前
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestBody
`@RequestBody` 是 Spring 框架中的注解,用于将 HTTP 请求体中的 JSON 数据自动映射为 Java 对象。例如,前端通过 POST 请求发送包含 `username` 和 `password` 的 JSON 数据,后端可通过带有 `@RequestBody` 注解的方法参数接收并处理。此注解适用于传递复杂对象的场景,简化了数据解析过程。与表单提交不同,它主要用于接收 JSON 格式的实体数据。
887 0
|
9月前
|
前端开发 Java 微服务
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@PathVariable
`@PathVariable` 是 Spring Boot 中用于从 URL 中提取参数的注解,支持 RESTful 风格接口开发。例如,通过 `@GetMapping(&quot;/user/{id}&quot;)` 可以将 URL 中的 `{id}` 参数自动映射到方法参数中。若参数名不一致,可通过 `@PathVariable(&quot;自定义名&quot;)` 指定绑定关系。此外,还支持多参数占位符,如 `/user/{id}/{name}`,分别映射到方法中的多个参数。运行项目后,访问指定 URL 即可验证参数是否正确接收。
554 0
|
9月前
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestMapping
@RequestMapping 是 Spring MVC 中用于请求地址映射的注解,可作用于类或方法上。类级别定义控制器父路径,方法级别进一步指定处理逻辑。常用属性包括 value(请求地址)、method(请求类型,如 GET/POST 等,默认 GET)和 produces(返回内容类型)。例如:`@RequestMapping(value = &quot;/test&quot;, produces = &quot;application/json; charset=UTF-8&quot;)`。此外,针对不同请求方式还有简化注解,如 @GetMapping、@PostMapping 等。
482 0
|
9月前
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RestController
本文主要介绍 Spring Boot 中 MVC 开发常用的几个注解及其使用方式,包括 `@RestController`、`@RequestMapping`、`@PathVariable`、`@RequestParam` 和 `@RequestBody`。其中重点讲解了 `@RestController` 注解的构成与特点:它是 `@Controller` 和 `@ResponseBody` 的结合体,适用于返回 JSON 数据的场景。文章还指出,在需要模板渲染(如 Thymeleaf)而非前后端分离的情况下,应使用 `@Controller` 而非 `@RestController`
408 0
|
5月前
|
前端开发 Java API
Spring Cloud Gateway Server Web MVC报错“Unsupported transfer encoding: chunked”解决
本文解析了Spring Cloud Gateway中出现“Unsupported transfer encoding: chunked”错误的原因,指出该问题源于Feign依赖的HTTP客户端与服务端的`chunked`传输编码不兼容,并提供了具体的解决方案。通过规范Feign客户端接口的返回类型,可有效避免该异常,提升系统兼容性与稳定性。
403 0
|
5月前
|
SQL Java 数据库连接
Spring、SpringMVC 与 MyBatis 核心知识点解析
我梳理的这些内容,涵盖了 Spring、SpringMVC 和 MyBatis 的核心知识点。 在 Spring 中,我了解到 IOC 是控制反转,把对象控制权交容器;DI 是依赖注入,有三种实现方式。Bean 有五种作用域,单例 bean 的线程安全问题及自动装配方式也清晰了。事务基于数据库和 AOP,有失效场景和七种传播行为。AOP 是面向切面编程,动态代理有 JDK 和 CGLIB 两种。 SpringMVC 的 11 步执行流程我烂熟于心,还有那些常用注解的用法。 MyBatis 里,#{} 和 ${} 的区别很关键,获取主键、处理字段与属性名不匹配的方法也掌握了。多表查询、动态
181 0
|
5月前
|
JSON 前端开发 Java
第05课:Spring Boot中的MVC支持
第05课:Spring Boot中的MVC支持
292 0
|
11月前
|
SQL Java 数据库连接
对Spring、SpringMVC、MyBatis框架的介绍与解释
Spring 框架提供了全面的基础设施支持,Spring MVC 专注于 Web 层的开发,而 MyBatis 则是一个高效的持久层框架。这三个框架结合使用,可以显著提升 Java 企业级应用的开发效率和质量。通过理解它们的核心特性和使用方法,开发者可以更好地构建和维护复杂的应用程序。
651 29