1. 程式人生 > >使用H5的formData物件實現檔案的非同步上傳

使用H5的formData物件實現檔案的非同步上傳

再用springMvc的時候要實現一個圖片上傳的功能,又不想重新整理頁面,

ajax又不能實現檔案上傳,於是就開始尋找非同步上傳的方法,終於找到了一種學習了一下:

jsp中:

<div class="shop_member_bd_left_pic">
	img id="img1" src="${pageContext.request.contextPath }/upload/img/${customer.image}.jpg" height="200" width="300"/>
	<form name="fileinfo" enctype="multipart/form-data" >
		<div class="div1">
			<div class="div2">更改頭像</div>
				<input type="file" name="imgfile" class="inputstyle" onchange="previewFile();"/>
			</div>
	</form>
</div>
js中:
//預覽圖片程式碼
function previewFile() {
	//var preview = document.querySelector('img');
	var preview = document.getElementById("img1");
	var file  = document.querySelector('input[type=file]').files[0];
	var reader = new FileReader();
	 reader.onloadend = function () {
  	      preview.src = reader.result;
	 };
	if (file) {
	      reader.readAsDataURL(file);
	      upload();
	} else {
		  preview.src = "";
	 }
}


//上傳圖片程式碼
function upload(){
		  var oData = new FormData(document.forms.namedItem("fileinfo")); //新建一個formData物件
		
		 //oData.append("CustomField", "This is some extra data"); //在這可以向表單新增額外的資料,這裡沒有新增
		
		  var oReq = new XMLHttpRequest(); 
		  		//XMLHttpRequest 物件用於在後臺與伺服器交換資料。該物件的好處:
				//在不重新載入頁面的情況下更新網頁
				//在頁面已載入後從伺服器請求資料
				//在頁面已載入後從伺服器接收資料
				//在後臺向伺服器傳送資料
		  oReq.open("POST", "${pageContext.request.contextPath}/customer/customerImg", true);
		  oReq.onload = function(oEvent) {
		    if (oReq.status == 200) {
		    	alert("更改頭像成功!");
		    } else {
		      alert("更改頭像失敗!");
		    }
		  };
		
		  oReq.send(oData);       
	}

關於 XMLHttpRequest.open()

初始化 HTTP 請求引數

語法:open(method, url, async, username, password)

method 引數是用於請求的 HTTP 方法。值包括 GET、POST 和 HEAD。

url 引數是請求的主體。大多數瀏覽器實施了一個同源安全策略,並且要求這個 URL 與包含指令碼的文字具有相同的主機名和埠。

async 引數指示請求使用應該非同步地執行。如果這個引數是 false,請求是同步的,後續對 send() 的呼叫將阻塞,直到響應完全接收。

如果這個引數是 true 或省略,請求是非同步的,且通常需要一個 onreadystatechange 事件控制代碼。

username 和 password 引數是可選的,為 url 所需的授權提供認證資格。如果指定了,它們會覆蓋 url 自己指定的任何資格。

open只是初始化引數,傳送是由下邊的send()程式碼傳送至後臺。

關於 XMLHttpRequest.onload()

XMLHttpRequest 物件的 onload 回撥函式是在非同步請求載入完成後所執行的函式,當JavaScript 監測到請求的資料全部傳輸完成後就會觸發該函式。而 open() 函式設定非同步請求的 method、URL 和同步方式等引數,執行 open() 後再執行 send() 函式才開始向伺服器傳送請求。

其中oReq.status表示:伺服器反饋的狀態:

1xx - 資訊提示

2xx - 成功

3xx - 重定向

4xx - 客戶端錯誤

5xx - 伺服器錯誤

後臺程式碼:

@RequestMapping("/customerImg")
	@ResponseBody
	public String customerImg(HttpServletRequest request) {
		String result = "success";
		CustomerSpread customer = (CustomerSpread) request.getSession().getAttribute("customer");
		String path = request.getSession().getServletContext().getRealPath("");	 //獲取專案伺服器地址
		File file2 = new File(path+"\\upload\\img"); //設定一個檔案路徑
		if (!file2.exists()) { 
		     file2.mkdirs(); //如果資料夾不存在就建立所需的資料夾
	        }
		//二進位制上傳
		MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
		//獲取檔案
		CommonsMultipartFile imgfile = (CommonsMultipartFile) multipartRequest.getFile("imgfile");
		//判斷是否有檔案提交
		if(imgfile != null){
			if( !imgfile.isEmpty() ){
				  SimpleDateFormat sdf = new SimpleDateFormat("yyMMddHHmmssSSS");//到毫秒
				  String time = sdf.format(new Date()); //以時間設定為上傳的檔名
				  File file = new File(path+"\\upload\\img"+"/"+time+ ".jpg");
				  try {
					  imgfile.getFileItem().write(file); 
					  customer.setImage(time); 
					  customerService.setImage(customer); // 往資料庫寫入圖片名稱
					  request.getSession().setAttribute("customer", customer); //更新session
				  } catch (Exception e) {
					  result = "error";
				     e.printStackTrace();
				  }
			}
		}else {
			result = "error";
		}
		return result;
	}
這樣就實現了非同步上傳圖片,並在jsp頁面預覽,html5和js要好好學學了,都是查閱的知識特地整理希望對大家有幫助。

另外附上大牛的部落格講解:點選開啟連結

相關推薦

springboot+jquery實現檔案非同步——淺談SOA

關於springBoot就不做介紹了,個讓你覺得是個不錯的框架,要學習或者瞭解springBoot,應該對spring的一些基本配置有一定的瞭解,不要一蹴而就。這次的博文主要是介紹 springboot+jquery實現檔案非同步上傳,分一下幾點介紹: 第一、s

springboot中使用js.ajax()方法和multipartfile類實現檔案非同步-springboot(2)

前言 今天忽然發現,之前springmvc中我經常使用的檔案上傳的js包不可用在springboot中不可用了,使用包裡的方法訪問不到後臺上傳檔案介面,只能自己重新實現了。 之前沒有接觸過這塊,世紀專案中也只用到過幾次而已,只好多踩一踩坑 正文 直接先把程式碼列

【前端】利用ajax實現檔案非同步下載

利用ajax可以實現很酷的效果,在不重新整理頁面的情況下提交表單、修改資料狀態等等,可是如果表單裡還有input:file可就慘了,ajax不支援檔案的處理啊! ajax是使用了瀏覽器內部的XmlHttpRequest物件來傳輸XML資料的。既然是Xml的資料傳輸,那麼傳輸

SpringMVC + AJAX 實現檔案非同步

轉自:https://www.jianshu.com/p/f3987f0f471f 今天,我就這個問題來寫一篇如何用 SpringMVC + AJAX 實現的多檔案非同步上傳功能。基本的程式碼還是沿用上篇文章中所用到的專案,需要的朋友可以點選前面的連結檢視。在這裡只貼出關鍵程式碼。 首先

javascript 使用FormData實現圖片/檔案非同步

主要思路: 在html中新增上傳按鈕,為了方便,這裡使用<img>作為上傳按鈕,監聽<img>點選事件,在事件處理函式中,建立<input type="file">標籤,註冊<input type="file">

通過Servlet實現檔案和下載

一、要實現Servlet的檔案上傳和下載,首先需要藉助第三方的jar包        二、Servlet的程式碼        package com.xh.web; import org.apache

FastDFS:Java客戶都實現檔案、下載、修改、刪除

客戶端版本:fastdfs_client_v1.24.jar   配置檔案 connect_timeout = 200 network_timeout = 3000 charset = UTF-8 http.tracker_http_port = 8080 http.anti_steal

C#實踐問題:如何實現檔案下載等

一種學習的方法:把握住關鍵點、重點、難點、易錯點等,以點帶面。 使用C#編寫一個簡單的檔案上傳和下載功能很簡單,只要掌握了一些關鍵點和易錯點就足夠在很短的時間內設計一個實用的文件管理頁面。   檔案上傳   前端實現: 第一部分:在前臺aspx內嵌入一條上

Mac ssh連線遠端伺服器,並實現檔案和下載

使用scp命令實現上傳下載 1、從伺服器上下載檔案 scp [email protected]:/path/filename /Users/mac/Desktop(本地目錄) 例如:scp [email protected]:/root/test.txt /Users/mac/Desk

SecureCRT利用SFTP來實現檔案

SecureCRT 是一款支援 SSH 協議的終端模擬程式,支援在 Windows 下登入 UNIX 或者 LInux 伺服器主機的軟體,是一款用於連線執行 Windows、UNIX 和 VMS 的理想工具。 SecureCRT可在 360 軟體管家裡搜尋下載安裝,安裝完成後需要破解,網上教

普通檔案(表單和ajax檔案非同步

一.表單上傳: html客戶端部分: <form action="upload.ashx" method="post" enctype="multipart/form-data"> 選擇檔案:<input type="file" name="file1" /><br /

jQuery-form實現檔案分步

//新增組別ajax newGroupAjax:function(data) { let _this = this; console.log(data) let optionType = localStorage.getItem("optionType"

使用common-fileupload實現檔案

                檔案上傳是網站非常常用的功能,直接使用Servlet獲取上傳檔案還得解析請求引數,比較麻煩,所以一般選擇採用apache的開源工具,common-fileupload.這個jar包可以再apache官網上面找到,也可以在struts的lib資料夾下面找到,struts上傳的功能

採用FTP協議實現檔案

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!                 請先明白一點,HTTP上傳和FTP上傳是不一樣的,HTTP上傳會帶有標頭檔案等等,你得分析,也就是通過網頁上傳。通過FTP上傳不用,因為他不會帶標頭檔案,操作

詳解SpringMVC使用MultipartFile實現檔案

本篇文章主要介紹了SpringMVC使用MultipartFile實現檔案的上傳,本地的檔案上傳到資源伺服器上,比較好的辦法就是通過ftp上傳。這裡是結合SpringMVC+ftp的形式上傳的,有興趣的可以瞭解一下。 如果需要實現跨伺服器上傳檔案,就是將我們本地的檔

vue中實現檔案讀取及下載

檔案的上傳利用input標籤的type="file"屬性,讀取用FileReader物件,下載通過建立a標籤實現 <template> <div class="filediv"> <el-button @click="downloadFile">下

基於Flask實現檔案功能的多例項Web服務

flask是Python中非常輕量的Web框架,允許開發者以非常少的程式碼實現各類的Web應用,本文將簡單例項一個簡單Web的檔案上傳功能的開發。 環境介紹 Centos 7.2, virtual env 下的python 3。 安裝flask

django如何實現檔案,修改,刪除,展示(03)

def add_img_video(request): if request.method == 'POST': adsUserForm = AdsUserForm(request.POST) adsImgForm = AdsImgF

thinkphp5 ajax圖片檔案非同步

html:<form id="form"> <input type="file" name="image"> </form>這裡依然需要form標籤包裹,雖然並不用它來提交。如果非要去掉form,就只能用原生的XMLHttpRequ

搭建apache2伺服器實現檔案下載

作業系統:ubuntu14.04 如何搭建檔案伺服器,通過網頁下載檔案? 1、安裝   apt-getinstall apache2 2、修改網頁伺服器的配置檔案 vim /etc/apache2/sites-available/000-default.confDocum