簡述Java異步上傳文件的三種方法。本站提示廣大學習愛好者:(簡述Java異步上傳文件的三種方法)文章只能為提供參考,不一定能成為您想要的結果。以下是簡述Java異步上傳文件的三種方法正文
本文為年夜家分享了三種Java異步上傳文件方法,供年夜家參考,詳細內容以下
第一種應用閱讀器插件上傳,須要必定的底層編碼功底,在這裡我就不講了,以避免誤人後輩,提出這點年夜家可以自行百度。
第二種應用隱蔽的iframe模仿異步上傳。為何在這裡說的是模仿呢?由於我們實際上是將前往成果放在了一個隱蔽的iframe中,所以才沒有使以後頁面跳轉,感到就像是異步操作一樣。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>隱蔽的iframe上傳文件</title>
<script type="text/javascript" src="jquery途徑..."></script>
</head>
<body>
<iframe name="frm" ></iframe>
<form action="/upload2" enctype="multipart/form-data" method="post" target="frm" onsubmit="loading(true);">
<p id="upfile">附件:
<input type="file" name="myfile" >
</p>
<p id="upbtn">
<input type="submit" value="異步上傳">
<span id="uptxt" >正在上傳...</span>
</p>
</form>
<div id="flist" ></div>
<script>
// 上傳完成後的回調
function uploadFinished(fileName) {
addToFlist(fileName);
loading(false);
}
function addToFlist(fname) {
var temp = ["<p id='" + fname + "'>",
fname,
"<button onclick='delFile(\"" + fname + "\");'>刪除</button>",
"</p>"
];
$("#flist").append(temp.join(""));
}
function loading(showloading) {
if (showloading) {
$("#uptxt").show();
} else {
$("#uptxt").hide;
}
}
</script>
</body>
</html>
這類技巧有兩個症結的處所:
1.form會指定target,提交的成果定向前往到隱蔽的ifram中。(即form的target與iframe的name屬性分歧)。
2.提交完成後,iframe中頁面與主頁面通訊,告訴上傳成果及辦事端文件信息
若何與主頁面通訊呢?
我們用nodejs在吸收完了文件後前往了一個window.parent.主頁面界說的辦法,履行後可以得知文件上傳完成。代碼很簡略:
router.post('/upload2', multipartMiddleware, function(req, res) {
var fpath = req.files.myfile.path;
var fname = fpath.substr(fpath.lastIndexOf('\\') + 1);
setTimeout(function {
var ret = ["<script>",
"window.parent.uploadFinished('" + fname + "');",
"</script>"];
res.send(ret.join(""));
}, 3000);
});
履行後可以翻開開辟人員選項,你會發明隱蔽iframe中前往了辦事器的一些數據。
第三種應用XMLHttpRequest2來停止真實的異步上傳。
照樣先貼出代碼:
履行後可以翻開開辟人員選項,你會發明隱蔽iframe中前往了辦事器的一些數據。第三種應用XMLHttpRequest2來停止真實的異步上傳。照樣先貼出代碼:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>xhr level2 異步上傳</title>
<script type="text/javascript" src="jquery途徑..."></script>
</head>
<body>
<div>
<p id="upfile">附件: <input type="file" id="myfile" ></p>
<p id="upbtn">
<input type="button" value="異步上傳" onclick="upload;">
<span id="uptxt" >正在上傳...</span>
<span id="upprog"></span>
<button id="stopbtn" >停滯上傳</button>
</p>
</div>
<div id="flist" ></div>
<script>
function upload {
// 1.預備FormData
var fd = new FormData;
fd.append("myfile", $("#myfile")[0].files[0]);
// 創立xhr對象
var xhr = new XMLHttpRequest;
// 監聽狀況,及時呼應
// xhr 和 xhr.upload 都有progress事宜,xhr.progress是下載進度,xhr.upload.progress是上傳進度
xhr.upload.onprogress = function(event) {
if (event.lengthComputable) {
var percent = Math.round(event.loaded * 100 / event.total);
console.log('%d%', percent);
$("#upprog").text(percent);
}
};
// 傳輸開端事宜
xhr.onloadstart = function(event) {
console.log('load start');
$("#upprog").text('開端上傳');
$("#stopbtn").one('click', function { xhr.abort; $(this).hide();});
loading(true);
};
// ajax進程勝利完成事宜
xhr.onload = function(event) {
console.log('load success');
$("#upprog").text('上傳勝利');
console.log(xhr.responseText);
var ret = JSON.parse(xhr.responseText);
addToFlist(ret.fname);
};
// ajax進程產生毛病事宜
xhr.onerror = function(event) {
console.log('error');
$("#upprog").text('產生毛病');
};
// ajax被撤消
xhr.onabort = function(event) {
console.log('abort');
$("#upprog").text('操作被撤消');
};
// loadend傳輸停止,不論勝利掉敗都邑被觸發
xhr.onloadend = function (event) {
console.log('load end');
loading(false);
};
// 提議ajax要求傳送數據
xhr.open('POST', '/upload3', true);
xhr.send(fd);
}
function addToFlist(fname) {
var temp = ["<p id='" + fname + "'>",
fname,
"<button onclick='delFile(\"" + fname + "\");'>刪除</button>",
"</p>"
];
$("#flist").append(temp.join(""));
}
function delFile(fname) {
console.log('to delete file: ' + fname);
// TODO: 請完成
}
function loading(showloading) {
if (showloading) {
$("#uptxt").show();
$("#stopbtn").show();
} else {
$("#uptxt").hide();
$("#stopbtn").hide();
}
}
</script>
</body>
</html>
代碼有點多,然則淺顯易懂。應用過AJAX的人都曉得,XHR對象供給了一個onreadystatechange的回調辦法來監聽全部要求/呼應進程。在XMLHttpRequest2級標准中又多了幾個進度事宜。有以下6個事宜:
1.loadstart: 在吸收到呼應數據的第一個字節時觸發。
2.progress: 在吸收呼應時代連續赓續地觸發。
3.error: 在要求產生毛病時觸發。
4.abort: 在由於挪用abort辦法而終止銜接時觸發。
5.load: 在吸收到完全的呼應數據時觸發。
6.loadend: 在通訊完成或許觸發error,abort,load事宜後觸發。
此次我們可以解讀代碼:當傳輸事宜開端後,我們便在停滯傳送按鈕上添加點擊事宜,內置了abort辦法可以停滯傳送。若不點則會正常上傳直到傳送終了為止。厥後台代碼相似第二種辦法。
三種辦法各有好壞,做個簡略的小結吧。
第三方控件交互性和可控性好,由於接近底層,其機能也是很優良的。然則因為編寫難度年夜平日須要本身裝置插件,有時能夠須要本身停止編寫。
隱蔽的iframe辦法我小我認為長短常有思惟的一個辦法,iframe可以幫我們做許多事。這類方法具有普遍的閱讀器兼容性並且不須要裝置插件。然則它交互性差,上傳進程弗成控,並且機能也是很普通的。
XHR2級的純ajax上傳,它必需要版本比擬高一點的閱讀器(ie9+)。然則它交互性特殊好,可以看到上傳進度而且是可控的。
開辟可按需求來采取分歧辦法。小我認為這些文件上傳,特殊是第二種供給的是一種思惟,充足的應用了某些html標簽的特征,能夠是我們開辟人員須要多思慮的處所。
以上就是本文的全體內容,願望對年夜家的進修有所贊助。