クライアント側で実行される私のJavascriptコードは、サーバーに保存されているバイナリファイルを読み取る必要があります。どうすればすべてのブラウザでそれを行うことができますか?
InternetExplorerでのみ機能するActiveXObject-FileSystemObjectを使用したソリューションを見つけました。
ありがとう
クライアント側で実行される私のJavascriptコードは、サーバーに保存されているバイナリファイルを読み取る必要があります。どうすればすべてのブラウザでそれを行うことができますか?
InternetExplorerでのみ機能する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();
}
}