ajax 和 adodb.stream组件 上传本地文件

前端之家收集整理的这篇文章主要介绍了ajax 和 adodb.stream组件 上传本地文件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

1、首先,AJAX是什么?其全称是Asynchronous JavaScript and XML,即异步的JAVASCRIPT 和 XML。它不是一种新的编程语言,

而是一种利用现有技术实现的与服务器交换数据达到局部刷新(即无需重新加载整个页面,仅更新局部页面)的技术。

注意:要实现局部刷新,也可以使用Iframe来实现。

2、XMLHttpRequest对象

XMLHttpRequest对象是AJAX的基础,用于建立请求、向服务器发送数据等等。

所有现代浏览器(IE7+、Firefox、Chrome、Safari 以及 Opera)均支持 XMLHttpRequest 对象(IE5 和 IE6 使用 ActiveXObject)。

创建XMLHttpRequest对象:

var xmlhttp= window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHttp");

通过使用 XMLHttpRequest 对象的 open() 和 send() 方法,向服务器发送请求:

xmlhttp.open("GET",target_url,true);
xmlhttp.send();

方法参数介绍:

open(method,url,async):

  • method:请求的类型;GET(使用GET,可能获取的是缓存文件) 或 POST (当发送大量数据时,使用POST,因为POST没有数据量限制,并且稳定些)
  • url文件在服务器上的位置
  • async:true(异步)或 false(同步)

send(string):

将请求发送到服务器。(参数string:仅用于 POST 请求)

3、POST 提交form数据

如果需要像 HTML 表单那样 POST 数据,则需要通过 setRequestHeader() 来添加 HTTP 头。然后在 send() 方法添加要发送的数据:

var xmlhttp= window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHttp");
xmlhttp.open("post","result.jsp",false);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("name=xiao8&password=123");

4、服务器响应

可以通过XMLHttpRequest 对象的 responseText 或 responseXML 属性获取服务器响应信息。

responseText : 获得字符串形式的响应数据。

responseXML : 获得 XML 形式的响应数据。

5、通过ajax 和 adodb.stream组件上传文件

首先需要通过adodb.stream组件装载本地文件数据,然后生成xml对象,并封装数据,在通过ajax把xml数据发送到服务器,最后在服务器解析出来。

下面是具体例子:通过js封装xml数据,上传本地附件

// 保存到xml附件,并且通过ajax 上传
	function SaveAttachment(upload_filename,localFilePath,upload_filepath){

   	 	var upload_target_url = "<%=targetURL%>";
    	
    	var strTempFile = localFilePath;
    	// 创建XML对象,组合XML文档数据
    	var xml_dom = createDocument();
    	xml_dom.loadXML('<?xml version="1.0" encoding="GBK" ?> <root/>');
    
    	// 创建ADODB.Stream对象
    	var ado_stream = new ActiveXObject("adodb.stream");
    	// 设置流数据类型为二进制类型
    	ado_stream.Type = 1; // adTypeBinary
    	// 打开ADODB.Stream对象
    	ado_stream.Open();
    	// 将本地文件装载到ADODB.Stream对象中
    	ado_stream.LoadFromFile(strTempFile);
    	// 获取文件大小(以字节为单位)
    	var byte_size = ado_stream.Size;
    	// 设置数据传输单元大小为1KB
    	var byte_unit = 1024;
    	// 获取文件分割数据单元的数量
    	var read_count = parseInt((byte_size/byte_unit).toString())+parseInt(((byte_size%byte_unit)==0)?0:1);
    	
    	// 创建XML元素节点,保存上传文件名称
    	var node = xml_dom.createElement("uploadfilename");
    	node.text = upload_filename.toString();
   		var root =  xml_dom.documentElement;
   		root.appendChild(node);
    
    	// 创建XML元素节点,procId
    	var node = xml_dom.createElement("procid");
    	node.text = "<%=procId%>";
   		root.appendChild(node);
   		
   		// 创建XML元素节点,签发人
    	var node = xml_dom.createElement("qfPerson");
    	var qfPerson =  $("#person").val();
    	if(qfPerson == "99"){
    		qfPerson = $("#o_person").val();
    	}
    	node.text = qfPerson;
   		root.appendChild(node);
   		
   		// 签发时间
   		var node = xml_dom.createElement("qfTime");
    	var qfTime =  $("#qfTime").val();
    	node.text = qfTime;
   		root.appendChild(node);
   		
    	// 创建XML元素节点,保存上传文件路径
    	var node = xml_dom.createElement("uploadfilepath");
    	node.text = upload_filepath.toString();
    	root.appendChild(node);
    
    	// 创建XML元素节点,保存上传文件大小
    	var node = xml_dom.createElement("uploadfilesize");
    	node.text = byte_size.toString();
    	root.appendChild(node);
    
    	// 创建XML元素节点,保存上传文件内容
    	for(var i=0;i<read_count;i++)
    	{
        	var node = xml_dom.createElement("uploadcontent");
        	// 文件内容编码方式为Base64
        	node.dataType = "bin.base64";
        	// 判断当前保存的数据节点大小,根据条件进行分类操作
        	if((parseInt(byte_size%byte_unit)!=0)&&(i==parseInt(read_count-1)))
        	{
            	// 当数据包大小不是数据单元的整数倍时,读取最后剩余的小于数据单元的所有数据
            	node.nodeTypedValue = ado_stream.Read();
        	}
        	else
        	{
            	// 读取一个完整数据单元的数据
            	node.nodeTypedValue = ado_stream.Read(byte_unit);
        	}
        	root.appendChild(node);
    	}
    
    	// 关闭ADODB.Stream对象
    	ado_stream.Close();
    	delete ado_stream;
    	// 创建Microsoft.XMLHTTP对象
    	// var xmlhttp = new ActiveXObject("microsoft.xmlhttp");
    	var xmlhttp= window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHttp");
    	// 打开Microsoft.XMLHTP对象
    	xmlhttp.open("post",upload_target_url,false);
    	// 使用Microsoft.XMLHTP对象上传文件
    	xmlhttp.send(xml_dom);
    	var state = xmlhttp.readyState;
    	var success_state = true;
    	if(state != 4){
    		success_state = false;
    	}
    	
		delete xmlhttp;
		
		return success_state;
  }
  
  // 创建DOMdocuemnt
	function createDocument() {
    	var xmldom;
        var versions = ["MSXML2.DOMDocument.6.0","MSXML2.DOMDocument.5.0","MSXML2.DOMDocument.4.0","MSXML2.DOMDocument.3.0","MSXML2.DOMDocument"],i,len;
        for (i = 0,len = versions.length; i < len; i++) {
            try {
                xmldom = new ActiveXObject(versions[i]);
                if(xmldom != null)
                	break;
            } catch (ex) {
                //跳过
                alert("创建document对象失败!");
            }
        }
    	return xmldom;
	}

服务器解析数据(java servlet)

@H_404_76@ public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException { // 设置数据传输单元大小为1KB int unit_size = 1024; // 初始化xml文件大小(以字节为单位) int xmlfilesize = 0; // 初始化上传文件名称(完整文件名) String xmlfilename = ""; // 初始化上传文件保存路径(绝对物理路径) String xmlfilepath = ""; // procid String procId = ""; // 签发人 String qfPerson = ""; // 签发时间 String qfTime = ""; // 声明文件存储字节数组 byte[] xmlfilebytes = null; try { // 初始化 SAX 串行xml文件解析器 SAXBuilder builder = new SAXBuilder(); Document doc = builder.build(request.getInputStream()); Element eroot = doc.getRootElement(); // 获取上传文件的完整名称 Iterator it_name = eroot.getChildren("uploadfilename").iterator(); if (it_name.hasNext()) { xmlfilename = ((Element) it_name.next()).getText(); } // 获取上传文件的完整名称 Iterator it_procId = eroot.getChildren("procid").iterator(); if (it_procId.hasNext()) { procId = ((Element) it_procId.next()).getText(); } // 获取签发人 Iterator it_qfPerson = eroot.getChildren("qfPerson").iterator(); if (it_qfPerson.hasNext()) { qfPerson = ((Element) it_qfPerson.next()).getText(); } // 获取签发时间 Iterator it_qfTime = eroot.getChildren("qfTime").iterator(); if (it_qfTime.hasNext()) { qfTime = ((Element) it_qfTime.next()).getText(); System.out.println("qfTime:"+qfTime); } // 获取上传文件保存的绝对物理路径 Iterator it_path = eroot.getChildren("uploadfilepath").iterator(); if (it_path.hasNext()) { xmlfilepath = ((Element) it_path.next()).getText(); } // 获取上传文件的大小 Iterator it_size = eroot.getChildren("uploadfilesize").iterator(); if (it_size.hasNext()) { xmlfilesize = Integer.parseInt(((Element) it_size.next()) .getText()); if (xmlfilesize > 0) { int unit_count = 0; // 为存储文件内容的字节数组分配存储空间 xmlfilebytes = new byte[xmlfilesize]; // 循环读取文件内容,并保存到字节数组中 Iterator it_content = eroot.getChildren("uploadcontent") .iterator(); while (it_content.hasNext()) { // 初始化Base64编码解码器 BASE64Decoder base64 = new BASE64Decoder(); byte[] xmlnodebytearray = base64 .decodeBuffer(((Element) it_content.next()) .getText()); if (xmlnodebytearray.length >= unit_size) { // 读取一个完整数据单元的数据 System.arraycopy(xmlnodebytearray,xmlfilebytes,unit_count * unit_size,unit_size); } else { // 读取小于一个数据单元的所有数据 System.arraycopy(xmlnodebytearray,xmlfilesize % unit_size); } // 继续向下读取文件内容 unit_count++; } } } // 保存路径 File path = new File(xmlfilepath); if(!path.exists()){ path.mkdirs(); } // 保存文件 File file = new File(path,xmlfilename); // 创建文件输入输出流 FileOutputStream fos = new FileOutputStream(file); // 写入文件内容 fos.write(xmlfilebytes); fos.flush(); // 关闭文件输入输出流 fos.close(); } catch (Exception e) { e.printStackTrace(); } }

猜你在找的Ajax相关文章