近期项目中有好几次用到多图上传,第一次在项目中真正用到Ajax技术,稍微整理了下,贴个案例出来。

我们传统的做法是当用户提交一个表单时,就向web服务器端发送一个请求。服务器接受并处理传来的表单信息,处理完成后返回一个新的页面。这个做法比较浪费带宽,当请求数较多时,页面响应的时间就依赖于服务器处理的时间。

而Ajax应用仅向服务器发送并取回必需的数据,其他不需要的数据不用响应,它使用SOAP或其它一些基于XML的web service接口,并在客户端采用JS来处理来自服务器的响应。因此在服务器和浏览器之间交换的数据比较少,应用能很快速的响应。使用Ajax应用的最大特点是实现内容部分更新,不用刷新整个页面就能维护指定的数据,实现动态更新,这样能避免在网络上发送一些没有修改过的信息。Ajax应用的最大缺点是可能破坏浏览器后退按钮的正常行为。在Ajax中,JS主要用于将用户界面上的数据传递到服务器端,并处理返回来的结果。XMLHttpRequest对象用来响应通过http传递的数据,一旦数据返回到客户端就可以立刻使用DOM将数据放到页面上。

工作原理大致如下:

1.新建一个XMLHttpRequest 对象,用于直接与服务器通信。注意不同浏览器的不同写法。

xhr = new XMLHttpRequest();

2.向服务器发送请求,需要使用open()和send()。

open() 方法需要三个参数。第一个参数定义发送请求所使用的方法(GET 还是 POST)。第二个参数规定服务器端脚本的 URL。第三个参数规定应当对请求进行异步地处理。

send() 方法可将请求送往服务器。只有一个参数,为要发送的数据,如果没有数据,则传null。

xhr.open('POST',self.uploadURL,true);
xhr.send(formData);    //formData为序列化的表单数据

3.定义onreadystatechange函数。XMLHttpRequest 对象的三个重要的属性:onreadystatechange(服务器响应的函数),readyState(服务器响应的状态),responseText(服务器返回的数据) 

xhr.onreadystatechange = function(){
  if(xhr.readyState == 4){      //状态码为4时,表示请求已完成
    self.cbUploadFile(xhr.responseText);       //xhr.responseText表示服务器返回的数据,为JSON文本
  }
}

案例截图:

源代码:

 <!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" Content="text/html; charset=utf-8;">
<title> JS AJAX多图上传 </title>
<meta name="author" content="rainna" />
<meta name="keywords" content="rainna's js lib" />
<meta name="description" content="JS Ajax多图上传" />
<style>
.m-imglist{margin:20px 0 0;}
.m-imglist img{float:left;width:200px;height:200px;margin:0 10px 10px 0;}
</style>
</head> <body>
<form name="form" id="form">
<input type="file" multiple />
</form>
<div class="m-imglist" id="imglist"></div> <script>
var uploadPic = {
upForm:document.getElementById('form'),
uploadIpt:document.getElementsByTagName('input')[0],
uploadURL:'http://upload.photo.163.com/upload/usere?sitefrom=lowerwerewog&responsetype=json&uswerinesize=3000x15000x0x100', //开始上传
uploadFile:function(event){
var self = this;
self.files = event.target.files || event.dataTransfer.files;
for(var i=0,l=self.files.length;i<l;i++){
self.doUploadFile(self.files[i]);
}
},
//执行上传
doUploadFile:function(file){
if(!file) return;
var self = this,
xhr = new XMLHttpRequest(), //新建xhr对象
formData = new FormData(); //FormData()对象用于存放序列化的表单数据
formData.append('Filedata', file); if(xhr.upload) {
//向服务器发送请求
xhr.open('POST',self.uploadURL,true);
xhr.send(formData); xhr.onreadystatechange = function(){
  if(xhr.readyState == 4){ //状态码为4时,表示请求已完成
    self.cbUploadFile(xhr.responseText); //xhr.responseText表示服务器返回的数据,为JSON文本
  }
}
}
},
//上传回调
cbUploadFile:function(text){
var photo,userDef1Url,node;
var self = this;
photo = JSON.parse(text);
if(photo.resultcode == 999){ //成功上传
userDef1Url = photo.userDef1Url; //图片的url地址
node = new Image();
node.src = userDef1Url;
}
document.getElementById('imglist').appendChild(node);
},
//初始化
init:function(){
var self = this;
self.uploadIpt.onchange = function(event){
self.uploadFile(event);
}
}
}; uploadPic.init();
</script>
</body>
</html>

JS案例之4——Ajax多图上传的更多相关文章

  1. ajax多图上传

    百度云代码 参考:https://segmentfault.com/q/1010000004218827

  2. python django + js 使用ajax进行文件上传并获取上传进度案例

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. ajaxfileupload.js插件结合一般处理文件实现Ajax无刷新上传

    先上几张图更直观展示一下要实现的功能.本功能主要通过Jquery ajaxfileupload.js插件结合ajaxUpFile.ashx一般应用程序处理文件实现Ajax无刷新上传功能,结合NPOI2 ...

  4. Bootstrap+PHP fileinput 实现多图上传 这是ajax上传,只能单张单张图片地上传

    插件及源代码可以在这里下载 http://www.jq22.com/jquery-info5231下面是根据下载的demo进行补充:使用bootstrap界面美观,可预览,可拖拽上传,可配合ajax异 ...

  5. js formData图片上传(单图上传、多图上传)后台java

    单图上传 <div class="imgUp">     <label>头像单图</label>     <input type=&quo ...

  6. PHP 多图上传,图片批量上传插件,webuploader.js,百度文件上传插件

    PHP  多图上传,图片批量上传插件,webuploader.js,百度文件上传插件(案例教程) WebUploader作用:http://fex.baidu.com/webuploader/gett ...

  7. thinkphp5多图上传 js部分

    在项目中常会用到多图上上传,那就需要多图上传后需要预览,并且能删掉传错(不想传)的图,然而 测试了半天 并不知道jq怎么写,parent()parents()用了半天无果,罢了,还是用原生js来写.这 ...

  8. PHP之:多图上传

    撰写日期:2016-6-30 15:17:35 Thursday 参考 http://a3147972.blog.51cto.com/2366547/1381136 (08-05ThinkPHP+sw ...

  9. 微信jssdk,实现多图上传的一点心得

    一.首先在common.js里封装一个函数,在需要调用jsSDK的页面引用此方法即可实现微信的信息配置function signatureJSSDK() { var url = window.loca ...

随机推荐

  1. IOS-UITextField-全解

    IOS-UITextField-全解   //初始化textfield并设置位置及大小   UITextField *text = [[UITextField alloc]initWithFrame: ...

  2. Cornerstone无法上传静态库文件(.a文件)

    在用Cornerstone同步文件时出现一个错误 检查后发现是缺少了一个文件 查询了网上的资料后发现是Cornerstone自动忽略了.a文件,所以上传到svn服务器时.a文件不会跟随工程一起传上去, ...

  3. android 之 spinner的简单使用

    先看spinner的效果图: 代码: MainActivity package com.mecury.spinnertest; import java.util.ArrayList; import a ...

  4. spring+mybatis多数据源切换

    在实际的公司项目中,很可能会遇到一个问题就是,一个java项目,但是项目中涉及两个数据库,这两个数据库还在不同IP的机子上. 遇到这种情况的时候,我们有两个选择 1.不走spring的aop方式,直接 ...

  5. 常用vi编辑命令

    在自己的博客里存起来,这么多全记住确实有点难,时不时的翻一翻到是可以的. 摘自:http://www.cnblogs.com/junw_china/articles/1708967.html 光标控制 ...

  6. Tomcat常用的优化技巧

    (1)屏蔽DNS查询 Web应用程序可以通过Web容器提供的getRemoteHost()方法获得访问Web应用客户的IP地址和名称,但是这样会消耗Web容器的资源,并且还需要通过IP地址和DNS服务 ...

  7. 烂泥:通过vsphere给esxi添加本地硬盘

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 公司ESXi服务器的硬盘空间不够使用,现在新加了一块硬盘在ESxi服务器上.在服务器上添加完硬盘后,在Vsphere上是看不到新加硬盘的. 下面我们来通 ...

  8. c#的序列化与反序列化

    这是反序列化的代码 using System.Runtime.Serialization.Json; public static T deserialize<T>(String s) { ...

  9. DirectX API 编程起步 #02 窗口的诞生

    在这篇文章里我们先用 windows API 制作一个窗口出来,以后再用 DirectX API 渲染的东西就会显示在这里,控制台那黑白的画面肯定是没法用的. 每次的代码都会更新到Github 首先贴 ...

  10. log4j日志优先级导致的不输出日志

    在sae部署微信代码的时候,发现它的默认日志很不友好,看起来很费劲,详细看了一下说明发现它可以根据log4j的输出级别而分类输出,就拖了一个log4j的xml文件扔进项目代码,然后部署运行,发现没有日 ...