2017-09-11 10 views
0

私はMEANスタックアプリケーションを開発中で、バックエンド(Express)からフロントエンド(Angular)にpdfを表示しようとしています。しかし、毎回、ファイルは送信中に壊れてしまいます。誰にもアイデアはありますか?ここ は(簡体字)私のコードです:Express Angular - Serve PDF

バックエンド:

import * as express from "express"; 
import * as fs from "fs"; 

myController.getPdf(req:express.Request, res:express.Response):void { 
    res.setHeader('Content-Type', 'application/pdf'); 
    res.setHeader('Content-Length', fs.statSync('myPdf.pdf').size); 
    fs.createReadStream('myPdf.pdf).pipe(res); 
} 

フロントエンド:

import {Http,ResponseContentType} from "@angular/http"; 

constructor(@Inject(Http) private _http:Http) {} 

this._http.get('ENDPOINT', {responseType: ResponseContentType.ArrayBuffer}) 
    .map(response => { 
     window.open(URL.createObjectURL(
      new Blob([response],{type:'application/pdf'}) 
))}); 

編集:ミドルウェア:

import * as compression from "compression"; 
import * as zlib from "zbil"; 
import * as express from "express"; 
import * as bodyParser from "body-parser"; 
import * as session from "express-session"; 
import * as passport from "passport"; 
import * as morgan from "morgan"; 
import * as helmet from "helmet"; 

application: express.Application; 
let _root = process.cwd(); 

application.use(compression({ 
    level: zlib.Z_BEST__COMPRESSION, 
    threshold: "1kb" 
})); 
application.use(express.static(_root + "/node_modules/")); 
application.use(express.static(_root + "/jspm_packages/")); 
application.use(express.static(_root + "/client/dev/")); 
application.use(bodyParser.json()); 
application.use(session({ 
    secret: 'abcd', 
    saveUnitialized: true, 
    resave: true, 
})); 
application.use(passport.initialize()); 
application.use(passport.session()); 
application.use(morgan("dev")); 
application.use(helmet()); 

答えて

0

あなたの "Content-Length"ヘッダーは無効だと思います。ファイルシステムのサイズメソッドは、文字列での文字列の長さを返します。

一部のUTF-8文字には複数のバイトが含まれています。

より良い方法は、http://nodejs.org/api/buffer.htmlのBuffer.byteLength(文字列、[encoding])を使用することです。これはクラスメソッドなので、Bufferインスタンスを作成する必要はありません。

+0

うーん...でも、この変更で、ファイルがまだ出力が読めません。 中古のミドルウェアを追加しました。おそらくそのうちの1つが私の送信を乱していますか? –

1

Content-Lengthとしてfs.statSync( 'myFile.pdf')。sizeを使用するとうまくいきました。

問題は、もう一方の端にあった:応答がブロブ()関数にマッピングする必要がありました:

this._http.get(ENDPOINT, {responseType: ResponseContentType.ArrayBuffer}) 
    .map(response => { 
     window.open(URL.createObjectURL(
      new Blob(response.blob(), {type:'application/pdf'})); 
    }); 
関連する問題