我在客户端运行的 Javascript 代码需要读取存储在服务器中的二进制文件。我怎样才能为所有浏览器做到这一点?
我找到了只在 Internet Explorer 中工作的 ActiveXObject - FileSystemObject 的解决方案。
谢谢
我在客户端运行的 Javascript 代码需要读取存储在服务器中的二进制文件。我怎样才能为所有浏览器做到这一点?
我找到了只在 Internet Explorer 中工作的 ActiveXObject - FileSystemObject 的解决方案。
谢谢
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 属性),以及它是否成功。同步地,它返回二进制数据。
对于经典的 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();
}
}