0

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

我找到了只在 Internet Explorer 中工作的 ActiveXObject - FileSystemObject 的解决方案。

谢谢

4

2 回答 2

1
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 属性),以及它是否成功。同步地,它返回二进制数据。

于 2012-05-23T21:21:45.167 回答
0

对于经典的 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();
  }
}
于 2012-05-23T11:26:18.147 回答