我在客户端运行的Javascript代码需要读取存储在服务器中的二进制文件。我怎样才能为所有浏览器做到这一点?
我找到了只能在Internet Explorer中使用的ActiveXObject - FileSystemObject解决方案。
由于
答案 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();
}
}