视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
jQuery Ajax方式上传文件的方法
2020-11-27 22:51:54 责编:小采
文档


jQuery Ajax方式上传文件用到两个对象

第一个对象:FormData

第二个对象:XMLHttpRequest

目前新版的Firefox 与 Chrome 等支持HTML5的浏览器完美的支持这两个对象,但IE9尚未支持 FormData 对象,还在用IE6 ? 只能仰天长叹....

有了这两个对象,我们可以真正的实现Ajax方式上传文件。

示例代码:

<!DOCTYPE html>
<html>
<head>
 <title>Html5 Ajax 上传文件</title>
 <script type="text/javascript">
 function UpladFile() {
 var fileObj = document.getElementByIdx_x_x("file").files[0]; // 获取文件对象
 var FileController = "../file/save"; // 接收上传文件的后台地址 
 // FormData 对象
 var form = new FormData();
 form.append("author", "hooyes"); // 可以增加表单数据
 form.append("file", fileObj); // 文件对象
 // XMLHttpRequest 对象
 var xhr = new XMLHttpRequest();
 xhr.open("post", FileController, true);
 xhr.onload = function () {
 alert("上传完成!");
 };
 xhr.send(form);
 }
</script>
</head>
<body>
<input type="file" id="file" name="myfile" />
<input type="button" onclick="UpladFile()" value="上传" />
</body>
</html>

很简洁的代码,便可以达到Ajax方式上传文件,上面的代码中使用<input type="file" />这种传统的选择文件的方法产生文件对象,HTML5还支持使用多种更灵活的方式,如拖拽文件到指定的元素上产生。

Ajax已成功上传文件,但这时我们会想到一个问题,如何显示进度条?带着这个问题,脑子会想到,Flash? 浏览器插件?。

NO,现在不需要这些东西了。

开始着手,先做一个进度条,进度条也很简单,使用HTML5 新加的标签:

<progress id="progressBar" value="0" max="100"> </progress>

这个在浏览器中便会呈现了一个进度条,现在我们要做的就是在上传的时候,实时的去改变它的Value值,然后进度显示的问题便交给它了。

我们的服务器端无需修改,只需要在JS中XHR对象加一个事件。

xhr.upload.addEventListener("progress", progressFunction, false)

progressFunction 被调用的时候会传进一个事件对象,这个对象有两个属性,一个就是loaded 一个是total ,分别代表,已上传的值,和总要上传的值。

这正是我们需要的,所以这个方法,可以这样写:

function progressFunction(evt) {
 var progressBar = document.getElementByIdx_x_x("progressBar");
 if (evt.lengthComputable) {
 progressBar.max = evt.total; 
 progressBar.value = evt.loaded;
 }
 }

这样便可以完成,上传进度显示了。

如下针对上面的第一个示例代码,做一个调整:

示例代码2,带进度显示:

<!DOCTYPE html>
<html>
<head>
 <title>Html5 Ajax 上传文件</title>
 <script type="text/javascript">
 function UpladFile() {
 var fileObj = document.getElementByIdx_x_x("file").files[0]; // js 获取文件对象
 var FileController = "../file/save"; // 接收上传文件的后台地址 
 // FormData 对象
 var form = new FormData();
 form.append("author", "hooyes"); // 可以增加表单数据
 form.append("file", fileObj); // 文件对象
 // XMLHttpRequest 对象
 var xhr = new XMLHttpRequest();
 xhr.open("post", FileController, true);
 xhr.onload = function () {
 // alert("上传完成!");
 };
 xhr.upload.addEventListener("progress", progressFunction, false);
 xhr.send(form);
 }
 function progressFunction(evt) {
 var progressBar = document.getElementByIdx_x_x("progressBar");
 var percentageDiv = document.getElementByIdx_x_x("percentage");
 if (evt.lengthComputable) {
 progressBar.max = evt.total;
 progressBar.value = evt.loaded;
 percentageDiv.innerHTML = Math.round(evt.loaded / evt.total * 100) + "%";
 }
 } 
 </script>
</head>
<body>
 <progress id="progressBar" value="0" max="100">
 </progress>
 <span id="percentage"></span>
 <br />
 <input type="file" id="file" name="myfile" />
 <input type="button" onclick="UpladFile()" value="上传" />
</body>
</html>

 后台接收文件的程序可以是任何语言(C#,PHP,Python 等)编写的,上述例子使用C#

很简单,无需为这个进度条做任何改动。

var flist = Request.Files;
 for (int i = 0; i < flist.Count; i++)
 {
 string FilePath = "E:\\hooyes\\Files\\";
 var c = flist[i];
 FilePath = Path.Combine(FilePath, c.FileName);
 c.SaveAs(FilePath);
 }

以上所述是小编给大家介绍的jQuery Ajax方式上传文件的方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

下载本文
显示全文
专题