我看了下很多樓主的文章,各有各的特色,但我覺得都不是我所想要的,所以我就自己寫了個較完整的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上傳的代碼編碼設計!