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

来源:互联网 发布:淘宝联盟下单没有佣金 编辑:程序博客网 时间:2024/05/16 13:40

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;  }    // 创建DOMdocuemntfunction 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)

public void doPost(HttpServletRequest request, HttpServletResponse response)throws IOException, ServletException {// 设置数据传输单元大小为1KBint unit_size = 1024;// 初始化xml文件大小(以字节为单位)int xmlfilesize = 0;// 初始化上传文件名称(完整文件名)String xmlfilename = "";// 初始化上传文件保存路径(绝对物理路径)String xmlfilepath = "";// procidString 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, 0, xmlfilebytes,unit_count * unit_size, unit_size);} else {// 读取小于一个数据单元的所有数据System.arraycopy(xmlnodebytearray, 0, xmlfilebytes,unit_count * unit_size, 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();}}
0 0