0

クライアント側で実行される私のJavascriptコードは、サーバーに保存されているバイナリファイルを読み取る必要があります。どうすればすべてのブラウザでそれを行うことができますか?

InternetExplorerでのみ機能する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 に答える