JavaScript File分段上傳
來源:易賢網(wǎng) 閱讀:628 次 日期:2016-07-21 14:58:31
溫馨提示:易賢網(wǎng)小編為您整理了“JavaScript File分段上傳”,方便廣大網(wǎng)友查閱!

這篇文章主要介紹了JavaScript File分段上傳的相關(guān)資料,需要的朋友可以參考下

HTML

<form method="POST" name="form" action="/mupload/upload/" enctype="multipart/form-data">

<input type='hidden' name='csrfmiddlewaretoken' value='' />

<input id='file' type='file' name='file' onchange="" />

<input id='button' name='submit' type='button' value="上傳" onclick="chunk_upload(this)"/>

</form>

js方法

var fileSplitSize = 1024 * 1024;

var start=0,end=0;

var i=0;

// 文件段上傳

function chunk_upload(button){

var xmlhttp = new XMLHttpRequest();

xmlhttp.open("POST", "/chunk_upload/upload/", false);

xmlhttp.setRequestHeader("X-CSRFToken", button.form['csrfmiddlewaretoken'].value);

var f = button.form;

var file = f['file']['files'][0];

var size=file.size;

end=start+fileSplitSize;

if(end>size){

i=-1;

end=size;

}else{

i+=1;

end=end;

}<br>  //按大小切割文件段

var blob = file.slice(start, end);

xmlhttp.setRequestHeader('charset','utf-8');

xmlhttp.setRequestHeader("fileMD5", fileMD5);

xmlhttp.setRequestHeader("start", start);

xmlhttp.setRequestHeader("end", end);

xmlhttp.send(blob);

if(xmlhttp.status==200){<br> if(end==size){<br> var backtext=xmlhttp.responseText;<br> alert(backtext);<br> }else{<br> alert("上傳完成第"+i+"段")<br> start=end;<br> chunk_upload(button);<br> }<br> }else{<br> alert("上傳錯(cuò)誤");<br> chunk_upload(button);<br> }

}

主要思想:

注意設(shè)置切割的起始位置和切割大小,通過XMLHttpRequest的發(fā)送請(qǐng)求(http協(xié)議要知道)。

如果一些標(biāo)記數(shù)據(jù)可以添加協(xié)議頭:xmlhttp.setRequestHeader("end", end);

發(fā)送協(xié)議體xmlhttp.send(data);

監(jiān)聽返回碼來判斷是否傳遞成功,在進(jìn)行下一步操作。

重新設(shè)置切割位置,然后遞歸調(diào)用自身start=end;chunk_upload(button);

注意:

切割的start與end和filesize的關(guān)系

純js異步上傳文件,并返回上傳進(jìn)度

純js實(shí)現(xiàn)異步上傳文件,異步返回文件上傳進(jìn)度,0.05到0.1秒回調(diào)一次上傳進(jìn)度,其它詳細(xì)見代碼片段下用法注釋

1. 簡(jiǎn)單的異步上傳函數(shù)

;(function(window,document){

var myUpload = function(option) {

var file,

fd = new FormData(),

xhr = new XMLHttpRequest(),

loaded, tot, per, uploadUrl,input;

input = document.createElement("input");

input.setAttribute('id',"myUpload-input");

input.setAttribute('type',"file");

input.setAttribute('name',"files");

input.click();

uploadUrl = option.uploadUrl;

callback = option.callback;

uploading = option.uploading;

beforeSend = option.beforeSend;

input.onchange= function(){

file = input.files[0];

if(beforeSend instanceof Function){

if(beforeSend(file) === false){

return false;

}

}

fd.append("files", file);

xhr.onreadystatechange = function() {

if (xhr.readyState == 4 && xhr.status == 200) {

if(callback instanceof Function){

callback(xhr.responseText);

}

}

}

//偵查當(dāng)前附件上傳情況

xhr.upload.onprogress = function(evt) {

loaded = evt.loaded;

tot = evt.total;

per = Math.floor(100 * loaded / tot); //已經(jīng)上傳的百分比

if(uploading instanceof Function){

uploading(per);

}

};

xhr.open("post", uploadUrl);

xhr.send(fd);

}

};

window.myUpload = myUpload;

})(window,document);

//用法

//觸發(fā)文件上傳事件

myUpload({

//上傳文件接收地址

uploadUrl: "/async/myUpload.php",

//選擇文件后,發(fā)送文件前自定義事件

//file為上傳的文件信息,可在此處做文件檢測(cè)、初始化進(jìn)度條等動(dòng)作

beforeSend: function(file) {

},

//文件上傳完成后回調(diào)函數(shù)

//res為文件上傳信息

callback: function(res) {

},

//返回上傳過程中包括上傳進(jìn)度的相關(guān)信息

//詳細(xì)請(qǐng)看res,可在此加入進(jìn)度條相關(guān)代碼

uploading: function(res) {

}

});

更多信息請(qǐng)查看網(wǎng)絡(luò)編程
易賢網(wǎng)手機(jī)網(wǎng)站地址:JavaScript File分段上傳
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

2025國(guó)考·省考課程試聽報(bào)名

  • 報(bào)班類型
  • 姓名
  • 手機(jī)號(hào)
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢 | 簡(jiǎn)要咨詢須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專用圖標(biāo)