廢話不多說了,直接給大家貼代碼了,具體代碼如下所示:
html代碼如下:
<body><input id="fileid" type="file" accept="video/*;capture=camera"onchange="onfile(this)"><input id="btn" type="button" value="提交"><script type="text/javascript">var xhr;function onfile(file) {var fd = new FormData();fd.append("fileToUpload", document.getElementById('fileid').files[0]);xhr = new XMLHttpRequest();xhr.open("POST", "http://localhost:8889/TestUp/upservlet");//xhr.setRequestHeader("Content-Type","charset=UTF-8");xhr.send(fd);xhr.onreadystatechange = processResponse;}function processResponse(){if(xhr.readyState == 4){alert("上傳結束數據流結束");if(xhr.status == 200){var infor = xhr.responseText;alert("服務器端的響應= "+infor);}}}</script></body>java代碼如下所示:
package com.yjm.up;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.util.List;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.fileupload.FileItem;import org.apache.commons.fileupload.disk.DiskFileItemFactory;import org.apache.commons.fileupload.servlet.ServletFileUpload;public class UpServlet extends HttpServlet {public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 得到上傳文件的保存目錄,將上傳的文件存放於WEB-INF目錄下,不允許外界直接訪問,保證上傳文件的安全String savePath = this.getServletContext().getRealPath("/WEB-INF/upload");File file = new File(savePath);System.out.println("test。。。。");// 判斷上傳文件的保存目錄是否存在if (!file.exists() && !file.isDirectory()) {System.out.println(savePath + "目錄不存在,需要創建");// 創建目錄file.mkdir();}// 消息提示String message = "";try {// 使用Apache文件上傳組件處理文件上傳步驟:// 1、創建一個DiskFileItemFactory工廠DiskFileItemFactory factory = new DiskFileItemFactory();// 2、創建一個文件上傳解析器ServletFileUpload upload = new ServletFileUpload(factory);// 解決上傳文件名的中文亂碼upload.setHeaderEncoding("UTF-8");// 3、判斷提交上來的數據是否是上傳表單的數據if (!ServletFileUpload.isMultipartContent(request)) {// 按照傳統方式獲取數據return;}// 4、使用ServletFileUpload解析器解析上傳數據,解析結果返回的是一個List<FileItem>集合,每一個FileItem對應一個Form表單的輸入項List<FileItem> list = upload.parseRequest(request);for (FileItem item : list) {// 如果fileitem中封裝的是普通輸入項的數據if (item.isFormField()) {String name = item.getFieldName();// 解決普通輸入項的數據的中文亂碼問題String value = item.getString("UTF-8");// value = new String(value.getBytes("iso8859-1"),"UTF-8");System.out.println(name + "=" + value);} else {// 如果fileitem中封裝的是上傳文件// 得到上傳的文件名稱,String filename = item.getName();System.out.println(filename);if (filename == null || filename.trim().equals("")) {continue;}// 注意:不同的瀏覽器提交的文件名是不一樣的,有些瀏覽器提交上來的文件名是帶有路徑的,如:// c:/a/b/1.txt,而有些只是單純的文件名,如:1.txt// 處理獲取到的上傳文件的文件名的路徑部分,只保留文件名部分filename = filename.substring(filename.lastIndexOf("//") + 1);// 獲取item中的上傳文件的輸入流InputStream in = item.getInputStream();// 創建一個文件輸出流FileOutputStream out = new FileOutputStream(savePath + "//"+ filename);// 創建一個緩衝區byte buffer[] = new byte[1024 * 1024];// 判斷輸入流中的數據是否已經讀完的標識int len = 0;// 循環將輸入流讀入到緩衝區當中,(len=in.read(buffer))>0就表示in裡面還有數據while ((len = in.read(buffer)) > 0) {// 使用FileOutputStream輸出流將緩衝區的數據寫入到指定的目錄(savePath + "//"// + filename)當中out.write(buffer, 0, len);}out.flush();// 關閉輸入流in.close();// 關閉輸出流out.close();// 刪除處理文件上傳時生成的臨時文件item.delete();message = "文件上傳成功!";}}} catch (Exception e) {message = "文件上傳失敗!";e.printStackTrace();}request.setAttribute("message", message);request.getRequestDispatcher("/message.jsp").forward(request, response);}}用到的java 包是超過1G上傳
commons-fileupload-1.2.1.jar
commons-io-1.3.2.jar
//xhr.setRequestHeader("Content-Type","application/octet-stream;charset=UTF-8"); 這不能添加