2017-11-23 13 views
1

私は私がしたいことに非常に近いと思います。私はSQL Serverデータベースからファイルvarbinary(MAX)を取得しているnode.jsの次のapi getメソッドを持っています。挿入前にbase64でエンコードされた文字列から変換され、コンテンツタイプの情報が文字列から削除されました。正常に動作しますが、何それを取得し、ユーザーのダウンロードを要求するように角度で行うには私のために明らかになっていない、また多くは限りがあったnode.jsから送信されたバイト配列からの角度ダウンロードファイル

のNode.js

router.get('/getFile', (req, res) => { 
    console.log("Calling getFile for file " + req.query.serialNumber + ".") 
    var serialNumber = req.query.serialNumber; 
    let request = new sql.Request(conn); 
    request.query('SELECT FileName + \'.\' + FileExtension AS \'File\', FileType, ContentType, SerialNumber, Chart ' + 
     'FROM dbo.ChangeFiles ' + 
     'WHERE SerialNumber = ' + serialNumber) 
     .then(function (recordset) { 
      log("Successfully retrieved file " + recordset[0].SerialNumber + " from database."); 
      log("Length of blob " + recordset[0].File + " is " + recordset[0].Chart.length) 
      res.status(200); 
      res.setHeader('Content-Type', recordset[0].ContentType); 
      res.setHeader('Content-Disposition', 'attachment;filename=' + recordset[0].File); 
      res.end(Buffer.from((recordset[0].Chart))); 
     }).catch(function (err) { 
      log(err); 
      res.status(500).send("Issue querying database!"); 
     }); 
}); 

オンラインでヘルプ/リソースとして。ここまでは、私がこれまでサービスクラスで持っていたことがあります。あなたが見ることができるように

fileDownload.service.ts

downloadFile(serialNumber: string): Observable<any> { 
    return this.http.get(this.baseURL + '/getFile', { params: { serialNumber: serialNumber } }) 
    .map(this.extractFile); 
} 


private extractFile(response: Response) { 
    const file = new Blob([response.blob]); 
    FileSaver.saveAs(file); 
    // const url = window.URL.createObjectURL(file); 
    // window.open(url); 
    return file; 
} 

私はアプローチのカップルを試みました。コメントアウトされたextractFileメソッドの部分はまったく機能しませんでした.FileSaver.saveAs関数を使用すると、不明なタイプのファイルがダウンロードされるため、node.jsから送信されたヘッダーはファイル自体に影響していないようです。

タイプに関係なく、ファイルを正常にダウンロードできるように、誰かがnode.jsから正常に送信されているものでAngularで進める方法をアドバイスできますか?

ありがとうございます。

答えて

0

私はそれを後に働いています。私は、MIMEタイプとファイル名をコンポーネントクラスのクライアント側のファイルに割り当てることができるように、ファイル情報をすべて別々に送信するように、api呼び出しを修正する必要がありました。何らかの理由で、私がapiでそうしようとしたとき、それはうまくいかなかったので、それは私の仕事でした。ここに私のために働くものがあります。

のNode.js API

router.get('/getFile', (req, res) => { 
    console.log("Calling getFile for file " + req.query.serialNumber + ".") 
    var serialNumber = req.query.serialNumber; 
    let request = new sql.Request(conn); 
    request.query('SELECT FileName + \'.\' + FileExtension AS \'File\', FileType, ContentType, SerialNumber, Chart ' + 
     'FROM dbo.ChangeFiles ' + 
     'WHERE SerialNumber = ' + serialNumber) 
     .then(function (recordset) { 
      log("Successfully retrieved file " + recordset[0].SerialNumber + " from database."); 
      log("Length of blob " + recordset[0].File + " is " + recordset[0].Chart.length) 
      res.send(recordset[0]); 
     }).catch(function (err) { 
      log(err); 
      res.status(500).send("Issue querying database!"); 
     }); 
}); 

コンポーネントクラス

downloadFile(serialNumber: string): void { 
    this.changeService.downloadFile(serialNumber).subscribe((res: any) => { 
     const ab = new ArrayBuffer(res.Chart.data.length); 
     const view = new Uint8Array(ab); 
     for (let i = 0; i < res.Chart.data.length; i++) { 
     view[i] = res.Chart.data[i]; 
     } 
     const file = new Blob([ab], { type: res.ContentType }); 
     FileSaver.saveAs(file, res.File); 
     console.log(res); 
    }); 
    } 

サービスクラス

downloadFile(serialNumber: string): Observable<any> { 
     return this.http.get(this.baseURL + '/getFile', { params: { serialNumber: serialNumber } }) 
     .map(this.extractFile); 
    } 

    private extractFile(response: Response) { 
     // const file = new Blob([response.blob]); 
     // FileSaver.saveAs(file); 
     // const url = window.URL.createObjectURL(file); 
     // window.open(url); 
     const body = response.json(); 
     return body || {}; 
    } 
0

マップの代わりにサブスクリプションを呼び出すようにコードを更新してください

関連する問題