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

目录
打赏
0
0
0
0
108
分享
相关文章
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestParam
本文介绍了 `@RequestParam` 注解的使用方法及其与 `@PathVariable` 的区别。`@RequestParam` 用于从请求中获取参数值(如 GET 请求的 URL 参数或 POST 请求的表单数据),而 `@PathVariable` 用于从 URL 模板中提取参数。文章通过示例代码详细说明了 `@RequestParam` 的常用属性,如 `required` 和 `defaultValue`,并展示了如何用实体类封装大量表单参数以简化处理流程。最后,结合 Postman 测试工具验证了接口的功能。
85 0
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestParam
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestBody
`@RequestBody` 是 Spring 框架中的注解,用于将 HTTP 请求体中的 JSON 数据自动映射为 Java 对象。例如,前端通过 POST 请求发送包含 `username` 和 `password` 的 JSON 数据,后端可通过带有 `@RequestBody` 注解的方法参数接收并处理。此注解适用于传递复杂对象的场景,简化了数据解析过程。与表单提交不同,它主要用于接收 JSON 格式的实体数据。
106 0
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@PathVariable
`@PathVariable` 是 Spring Boot 中用于从 URL 中提取参数的注解,支持 RESTful 风格接口开发。例如,通过 `@GetMapping(&quot;/user/{id}&quot;)` 可以将 URL 中的 `{id}` 参数自动映射到方法参数中。若参数名不一致,可通过 `@PathVariable(&quot;自定义名&quot;)` 指定绑定关系。此外,还支持多参数占位符,如 `/user/{id}/{name}`,分别映射到方法中的多个参数。运行项目后,访问指定 URL 即可验证参数是否正确接收。
77 0
微服务——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 等。
85 0
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RestController
本文主要介绍 Spring Boot 中 MVC 开发常用的几个注解及其使用方式,包括 `@RestController`、`@RequestMapping`、`@PathVariable`、`@RequestParam` 和 `@RequestBody`。其中重点讲解了 `@RestController` 注解的构成与特点:它是 `@Controller` 和 `@ResponseBody` 的结合体,适用于返回 JSON 数据的场景。文章还指出,在需要模板渲染(如 Thymeleaf)而非前后端分离的情况下,应使用 `@Controller` 而非 `@RestController`
63 0
对Spring、SpringMVC、MyBatis框架的介绍与解释
Spring 框架提供了全面的基础设施支持,Spring MVC 专注于 Web 层的开发,而 MyBatis 则是一个高效的持久层框架。这三个框架结合使用,可以显著提升 Java 企业级应用的开发效率和质量。通过理解它们的核心特性和使用方法,开发者可以更好地构建和维护复杂的应用程序。
188 29
步步深入SpringMvc DispatcherServlet源码掌握springmvc全流程原理
通过对 `DispatcherServlet`源码的深入剖析,我们了解了SpringMVC请求处理的全流程。`DispatcherServlet`作为前端控制器,负责请求的接收和分发,处理器映射和适配负责将请求分派到具体的处理器方法,视图解析器负责生成和渲染视图。理解这些核心组件及其交互原理,有助于开发者更好地使用和扩展SpringMVC框架。
91 4
Spring MVC中的请求映射:@RequestMapping注解深度解析
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的关键,它将HTTP请求映射到相应的处理器方法上。本文将深入探讨`@RequestMapping`注解的工作原理、使用方法以及最佳实践,为开发者提供一份详尽的技术干货。
451 2
如何使用 Spring 上传文件:全面指南
如何使用 Spring 上传文件:全面指南
211 1
SSM:SpringMVC
本文介绍了SpringMVC的依赖配置、请求参数处理、注解开发、JSON处理、拦截器、文件上传下载以及相关注意事项。首先,需要在`pom.xml`中添加必要的依赖,包括Servlet、JSTL、Spring Web MVC等。接着,在`web.xml`中配置DispatcherServlet,并设置Spring MVC的相关配置,如组件扫描、默认Servlet处理器等。然后,通过`@RequestMapping`等注解处理请求参数,使用`@ResponseBody`返回JSON数据。此外,还介绍了如何创建和配置拦截器、文件上传下载的功能,并强调了JSP文件的放置位置,避免404错误。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等