我看了下很多楼主的文章,各有各的特色,但我觉得都不是我所想要的,所以我就自己写了个较完整的demo
我通过ajax+springmvc实现的文件上传 ajax的技术并没有使用自身携带的AjaxFileUpload(个人觉得代码量太多)
用ajax实现,网页里的很多表单数据也想获得怎么办呢 我是这样实现的:
先看我的xxx.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="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
<script src="<%=request.getContextPath()%>/js/jquery-3.0.0.min.js" type="text/javascript"></script>
<script type="text/javascript">
function Upload(){
var img=$("#myBlogImage").val();
//判断文件是否为空 我这里是图片的上传 做了个文件后缀筛选 如果是文件相关的上传,把筛选去掉即可,文件大小,后缀的判断最好 //在前台判断,这样可减少服务器的压力
if(img==""){alert("请选择文件内容!");return }
//判断文件后缀
var start=img.lastIndexOf(".");
var end=img.substring(start+1,img.length).toUpperCase();
if(!(end=='JPG'||end=='GIF'||end=='PNG'||end=='BMP')){
alert('上传图片格式仅限于.jpg .gif .png .bmp');
return;
}
//封装form标签里的相关数据 传给后台 这样form里所有的表单数据 后台也能获取得到
var forData=new FormData($("#uploadForm")[0]);
//通过ajax实现文件上传 async:是否同步请求 ,cache:是否缓存此页面,contentType发送信息至服务器时内容编 //码类型。默认值适 合大多数情况,processData:通过data选项传递进来的数据类型选择;想了解更多,去看看 //$ajax()参数的相关讲解;
$.ajax({
url:'upload/toUpload.do',
type:'POST',
data:forData,
async:false,
cache:false,
contentType:false,
processData:false,
success:function(datas){
alert(datas);
},
error:function(datas){
alert("上传失败");
}
});
}
</script>
</head>
<body>
<div align="center">
<form id="uploadForm">
<p>资源名称:<input type="text" name="name"></p>
<p>选择文件<input type="file" id="myBlogImage" name="myfiles"/></p>
<input type="button" value="上传" οnclick="Upload()"/>
</form>
</div>
</body>
</html>
package com.azj.controllers;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
@Controller
@RequestMapping("/upload")
public class uploadController {
@RequestMapping(value="/toUpload",method = RequestMethod.POST)
public void doUpload(@RequestParam("name")String name,HttpServletRequest request,HttpServletResponse response) throws IllegalStateException, IOException{
//传统的都是通过io流来实现文件的上传,效率肯定是极低的!这里我们是通过springmvc自己及封装的文件 //上传方法;效率,比较快;感兴趣的可以测试下,大文件的上传速度,比较下;
//获取前端表单属性name传来的数据 并设计文件发存放位置
File fs=new File("D:/"+name);
if(!fs.exists())fs.mkdir();
//解析前端传过来的上下文
CommonsMultipartResolver cmr=new CommonsMultipartResolver(request.getSession().getServletContext());
//判断是传过来的上下文是否包含文件内容 如果有 执行文件处理及相关上传的操作
try{
if(cmr.isMultipart(request)){
//request强制转换为spring mvc自身携带的MultipartHttpServletRequest 文件处理
MultipartHttpServletRequest mr=(MultipartHttpServletRequest) request;
//迭代包含的文件
Iterator<String> iter=mr.getFileNames();
//获取文件
while(iter.hasNext()){
MultipartFile file = mr.getFile((String)iter.next());
if(file!=null){
String filename="demo"+file.getOriginalFilename();
String path="D:/"+name+"/"+filename;
File f=new File(path);
//传文件
file.transferTo(f);
response.getWriter().println("上传成功");
}
}
}}catch (Exception e) {
response.getWriter().println("上传失败");
}
}
}
以上便是controller里的代码内容
现在说下相关配置
web.xml的内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>spring-mvc</display-name>
<!-- 配置springMVC启动DispatcherServlete入口 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:config/applicationContext-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
接下来是spring mvc的配置内容:
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
<!-- 自动扫描的包名 这里是你请求的controller类 我用的通配符代替-->
<context:component-scan base-package="com.**.controllers"/>
<!-- 默认的注解映射的支持,自动注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter -->
<mvc:annotation-driven />
<!-- 视图解释类 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
</bean>
<!-- SpringMVC上传文件时,需配置MultipartResolver处理器 这个判断最好能在前端加个插件进行判断,减少服务器的压力-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 指定所上传文件的总大小不能超过10485760000......注意maxUploadSize属性的限制不是针对单个文件,而是所有文件的容量之和 -->
<property name="defaultEncoding" value="utf-8" />
<property name="maxUploadSize" value="10485760000" />
<property name="maxInMemorySize" value="40960" />
</bean>
</beans>
以上面试springmvc上传的代码编码设计!