1

私の JavaScript コードは、node.js サーバーに対して次の AJAX 要求を行います。

var url = '/node/download';
var downloadRequest = new goog.net.XhrIo();
downloadRequest.headers.set('content-type', 'application/json');
downloadRequest.send(url);

私の node.js サーバーは、ノードで pdf を作成し、次のコードを介して pdf をクライアントにストリーミングします。

    var filestream = fs.createReadStream(pdfpath);                  
    res.writeHead(200, {
        'Content-disposition': 'attachment; filename=' + filename,
        "Content-Type":"application/pdf","Content-Transfer-Encoding": "binary"});
    filestream.on('data', function(chunk) {                     
        res.write(chunk);
    });
    filestream.on('end', function() {
        res.end();
    });

しかし、現在、JavaScriptクライアントでこの応答を受け取る方法に問題があり、ダウンロードプロンプトが開き、ユーザーがpdfファイルをダウンロードして保存できるようになります。

助けてください!

事前にサンクス!

PS Plzは、ノードのコードを実装するためのより良い方法も提案します(ある場合)

編集: 考えられる解決策の 1 つは、次のようにリクエストを送信することです。

window.location.assign('/node/download');

このようにして、ダウンロード プロンプトが表示され、製品の非同期性が犠牲になることを除いて、すべて正常に動作します。非同期性も保持できるようにするための回避策はありますか?

4

2 に答える 2

1

サーバーに保存されているPDFファイルをダウンロードする場合

クライアントの JavaScript から次のようなリクエストを行います。

var reqObj = new XMLHttpRequest();
reqObj.open('GET','getpdf',true);     // 'getpdf' is the URI to recongize your request at the server
reqObj.send();

reqObj.onreadystatechange = function() {
    var resObj = this;
    if(resObj.readyState == resObj.DONE) {
        if (resObj.status != 200) {
            console.log("pdf can't be downloaded");
        } else if (resObj.status == 200){
            var resTxt = reqObj.responseText;
            window.location.assign(resTxt);    // Opens the pdf download prompt
        }
    }
}

ノードで、上から受け取ったリクエストを処理し、応答します。

var http = require('http');

function getPDFUrl() {
    return "http://testing.com/pdf/test.pdf";
}

var handler = http.createServer(function(request, response) {
if (request.url == 'getpdf' && request.method.toLowerCase() == 'get') {
    var pdfUrl = getPDFUrl();       //get pdf url here

    if (pdfUrl != null && pdfUrl != undefined && pdfUrl != '') {
        response.writeHead(200, {"Content-Type":"text/html"});
        response.write(pdfUrl);
        response.end();
    } else {
        response.writeHead(404, {"Content-Type":"text/html"});
        response.write("Not Found");
        response.end();
    }

}
});
于 2014-03-15T15:11:09.690 に答える