从Javascript(multibrowser)读取二进制文件

时间:2012-05-23 10:58:41

标签: javascript internet-explorer google-chrome activexobject

我在客户端运行的Javascript代码需要读取存储在服务器中的二进制文件。我怎样才能为所有浏览器做到这一点?

我找到了只能在Internet Explorer中使用的ActiveXObject - FileSystemObject解决方案。

由于

2 个答案:

答案 0 :(得分:2)

function getXHR(){
    var xhr;
    try{
        xhr = new XMLHttpRequest();
    }catch(e){
        try{
            xhr = new ActiveXObject("MSXML2.XMLHTTP.6.0");
        }catch(e2){
            try{
                xhr = new ActiveXObject("MSXML2.XMLHTTP");
            }catch(e3){}
        }
    }
    return xhr;
}


function getBinaryData(url, callback){
    var xhr = getXHR();
    xhr.open("GET", url, !!callback);
    if(callback){
        xhr.onload = function(){callback(xhr, true)};
        xhr.onerror = function(){callback(xhr, false)};
    }
    xhr.send();
    return callback ? undefined : xhr.responseText;
}

然后,您将使用getBinaryData来获取该文件。使用异步,它将使用xhr对象本身的参数调用回调(您将读取responseText属性),以及它是否成功。同步,它返回二进制数据。

答案 1 :(得分:1)

用于经典的asp服务器端javascript(来自我的旧文档服务器)

因为它是服务器端所有浏览器都会下载文件,在这种情况下,这段代码不是直接访问文件,而是在用户登录检查后使用。

Server.ScriptTimeout=500;//this might take some time
var docs_type="application/pdf";
var filename="...";//put your filename here (relative path)
var objStream = Server.CreateObject("ADODB.Stream");

try {
   objStream.Open();
   objStream.Type=1;//binary
  objStream.LoadFromFile(Server.MapPath(filename));
        Response.AddHeader("Content-Length", objStream.Size);
        Response.ContentType=docs_type;//the type of document you are serving 
        Response.AddHeader("Content-Disposition", "attachment; filename=your_filename.pdf");
        while(!objStream.EOS&&Response.IsClientConnected) {
            Response.BinaryWrite(objStream.Read(4*1024*256));
            Response.Flush();
        }
    objStream.Close();
    Response.End();
  } catch(e) {
        Response.Write("Error serving document<br>");
        Response.End();
  }
}