APIからユーザーに大きなblobをダウンロードすると、完了するまでダウンロードが表示されません

スプーンはありません

私の問題は、に似ています。この1ので、ここで私が得たものだが、それは多くのコンテキストまたは詳細なしで古いポストでした。

コンポーネントがダウンロードファイルメソッドを呼び出し、次にダウンロードファイルサービスを呼び出すと、サービスはAPIからHTTP GETリクエストを作成し、BLOBをサービスにストリーミングします。

成分:

    this.svc.getDownloadFile(fileID, fileName).subscribe(res => {
      console.log(res);
    });
  }

サービス:

  getDownloadFile(fileId: number, fileName: string): Observable<any> {
    return this.http.get(this.downloadFileUrl + "/" + fileId, {
      reportProgress: true,
      observe: "events",
      headers: this.getHeaders(),
      responseType: "blob"
    });
  }

問題は、これがAPI呼び出しであるため、blobがXHRを介してストリーミングされ、Chromeの[ネットワーク]タブでダウンロードと進行状況を確認できることです。私が抱えている問題は、Chrome(または任意のブラウザー)でファイルをダウンロードするときに通常予想される、ある種のブラウザーダウンロード通知を受け取ることです。これは、応答全体が完了した後にのみ発生します。

たとえば、データベースに50MBのファイルがあります。ユーザーがリンクをクリックしてAngularアプリからファイルをダウンロードすると、コンポーネントがサービスを呼び出し、API呼び出しを実行して、DBからファイルを取得し、blob応答としてストリーミングします。Angularはこの応答を受け取り、50 MBをすべてダウンロードするまで待機してから、ダウンロードダイアログを表示します。

ダウンロード通知は、100%完了した後にのみ表示されます

[ネットワーク]タブにダウンロードの進行状況が表示されます

APIは、コンテンツの長さ、コンテンツタイプ、ファイル名などとともにContent Dispositionヘッダーを返します。私はこれを模倣するものを探して高低を検索しましたが、ブラウザーが通常どおりに自動的にダウンロードしないことを理解しています。リクエストはAngularを介してパイプ処理されており、ブラウザーはすべてのblobXHRを保存する必要があると自動的に想定しないためです。

https://www.npmjs.com/package/streamsaverを使用してみましたが、このパッケージは実際にはすでに保存されているファイルのみを処理し、APIからblobとして送信されたファイルは処理しません。

スプーンはありません

したがって、ここで同じ問題を抱えている人々のために、私がしたことは次のとおりです。

これは私の作業設定用であることに注意してください。暗号化されたBLOBを格納するDBがあります。これは、ファイルストリームを介してAngularアプリにBLOBを提供するAPIです。

暗号化されていないAPIを使用している場合は、@ Paceで上記のようなことをwindow.open(urlToFile)またはで行うことができますwindow.location.href(urlToFile)

私のAPIはヘッダーのBearerトークンを介した承認を必要とするため、私が行ったことは、要求されているファイルIDとともにトークンをチェックするエンドポイントを作成することです。次に、APIはGUID(またはある種の一意のID)を作成し、GUIDとファイルIDを一緒にリストに保存します。リストは、有効期限とともにMemoryCacheに保存されます。

これが完了すると、GUIDが作成されたOk応答が返されます。私はセキュリティの専門家ではありませんが、次の理由でセキュリティが確保される可能性があると思いますが、これは完全な解決策ではないと確信しています。

  • GUIDを要求するには、ユーザーを認証する必要があります
  • GUIDは特定のファイルIDに関連付けられています
  • GUIDの有効期限が短い(1分など)
  • GUIDは1回使用すると削除されます
  • APIがGUIDを送り返すまでの時間と、GUIDを使用してAPIをコールバックするAngularアプリとの間の時間は非常に短いため、その時間枠の間に誰かがそれをジャックして、その使用方法を理解する方法がわかりません。

GUIDはAngularアプリに戻り、GUIDが戻ってきた後、呼び出しを呼び出しwindow.location.hrefて、GUIDとファイルIDを渡す別のエンドポイントに設定します。

このエンドポイントは認証を必要としないように構成されており、リストにあり、正しいGUIDが渡されたファイルのダウンロードのみを許可します。

たとえば、これは呼び出される私のサービスです。

getDownloadFile(fileId: number): Observable<any> {
    return this.http
      .get(this.downloadFileUrl + "/" + fileId, {
        headers: this.getHeaders() //Attaches bearer token
      })
      .pipe(
        tap(res => { //res = the GUID being returned from API
          window.location.href =
            this.downloadFileUrl + "/temp/" + fileId + "/" + res;
        })
      );
  }

ご覧のとおり、認証されたエンドポイントを呼び出し、GUIDを取得し、GUIDとファイルIDを使用して、現在のブラウザウィンドウのURLを一時エンドポイントにすぐに設定します。これは、Content Dispositionが正しく設定された状態で戻ってくるファイルストリームまたはBLOBであるため、Angularアプリから移動せず、ダウンロードマネージャーからダウンロードを開始するだけであることに注意してください。

これは、ブラウザがストリーミングAPIエンドポイントからのダウンロードを通常どおり処理できるようにする唯一の方法です。

ほとんどの小さなファイルは、APIを介して非常に高速にダウンロードされるため、ダウンロードが最初に開始されたかどうかがわからないため、実際には問題ではありません。通常、ダウンロードは瞬く間に行われるためですが、大きなファイルの場合は、 XHRを介してAPI呼び出しを行うと、リクエストが終了してからBAMが完了するまで、ユーザーはファイルがダウンロードされていることを示しません。突然、ダウンロードに150MBのファイルが表示されるようになりました。これも優れた方法です。Angularアプリを終了しても、アプリで終了する通常のAPI XHRサブスクリプションとは異なり、ダウンロードが継続されるためです。また、BLOBを含むXHRリクエストをタップして進行状況を追跡する方法も見つけましたが、Angularアプリ内に独自のダウンロードマネージャーを作成する必要があり、ほとんどのユーザーが期待するブラウザーのデフォルトを使用しないでください。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

一部の(すべてではありません)ユーザーは、Google Playからアプリをダウンロードすると、「パッケージファイルが正しく署名されていません」と表示されます。

分類Dev

ブラウザでダウンロードが開始されるまでローダーgifを表示する

分類Dev

Azure関数アプリがblobストレージから大きなファイルをダウンロードすると、「ディスクに十分なスペースがありません」というエラーが発生します

分類Dev

データベースからPDFファイルをダウンロードできません。プレーンなメモ帳が表示されます。

分類Dev

ユーザーがWebサイトからSVGをダウンロードできないようにする

分類Dev

SQLからblobを取得し、ブラウザに書き込んでダウンロードします

分類Dev

ユーザーがドロップダウンで値を選択するときにデータベースからIDを選択します

分類Dev

PHPダウンロードスクリプトは、ダウンロードが完了するまで他のページに移動できません

分類Dev

Expressからダウンロードを開始するブラウザを取得できません

分類Dev

ドロップダウンでは何も表示されません。ホバーすると表示されますが、なぜですか。

分類Dev

ドロップダウンから値を挿入するときにエラーは発生しませんが、挿入されません

分類Dev

常にblobをダウンロードすることはできません(reactjsを使用)

分類Dev

Linuxで単純なpuppeteerスクリプトを実行すると、この「ブラウザがダウンロードされません」というエラーが表示されるのはなぜですか?

分類Dev

ファイルをダウンロードすると、ユーザーはログアウトされます

分類Dev

ドロップダウンには、CSSHTMLでユーザーの画像と名前が表示されます

分類Dev

ユーザーがGoogleCloudStorageから画像をダウンロードできるようにする方法

分類Dev

インターネットから「大きな」ファイルをダウンロードするときに、LAN ネットワークがブロックまたは動作を停止します。何が原因でしょうか? (tcpdump 出力に STP メッセージが表示されます)

分類Dev

Windows 7のChemAxonから大きなファイルをダウンロードするには、ファイル全体がダウンロードされていることを確認するにはどうすればよいですか?

分類Dev

ファイルはChromeでダウンロードされますが、Safariではダウンロードされませんが、console.log(response)と[ネットワーク]タブには、サーバーから送信されているファイルが表示されます。

分類Dev

iCloudから画像をダウンロードするときに「必要なプライマリゾーンがありません」エラー

分類Dev

ユーザーが角度ドロップダウンメニューから空白の値を選択できるようにする方法はありますか

分類Dev

Pixel 4a-すでにダウンロードされていると表示されているのに、ARCoreが見つかりません

分類Dev

大きなテーブルを表示すると、HTMLテーブルヘッダーが常にウィンドウの上部に表示されます

分類Dev

Angular6からPDFをダウンロードするSpringboot apiを呼び出すと、エラーが発生し、応答を解析できません

分類Dev

一部のサブノードが現在のユーザーに対して禁止されているFirebaseデータベースノードをダウンロードすることはできますか?

分類Dev

ユーザーが YouTube 動画をダウンロードできる Play ストアに Android アプリをアップロードできますか?

分類Dev

NetBeansはリモートの場所からダウンロードされませんが、FTPをテストすることで成功します

分類Dev

サービスから返される配列にバインドするドロップダウンリストを取得できません

分類Dev

大きい解像度の画像のダウンロードが完了するまで、小さい解像度の画像をロードする

Related 関連記事

  1. 1

    一部の(すべてではありません)ユーザーは、Google Playからアプリをダウンロードすると、「パッケージファイルが正しく署名されていません」と表示されます。

  2. 2

    ブラウザでダウンロードが開始されるまでローダーgifを表示する

  3. 3

    Azure関数アプリがblobストレージから大きなファイルをダウンロードすると、「ディスクに十分なスペースがありません」というエラーが発生します

  4. 4

    データベースからPDFファイルをダウンロードできません。プレーンなメモ帳が表示されます。

  5. 5

    ユーザーがWebサイトからSVGをダウンロードできないようにする

  6. 6

    SQLからblobを取得し、ブラウザに書き込んでダウンロードします

  7. 7

    ユーザーがドロップダウンで値を選択するときにデータベースからIDを選択します

  8. 8

    PHPダウンロードスクリプトは、ダウンロードが完了するまで他のページに移動できません

  9. 9

    Expressからダウンロードを開始するブラウザを取得できません

  10. 10

    ドロップダウンでは何も表示されません。ホバーすると表示されますが、なぜですか。

  11. 11

    ドロップダウンから値を挿入するときにエラーは発生しませんが、挿入されません

  12. 12

    常にblobをダウンロードすることはできません(reactjsを使用)

  13. 13

    Linuxで単純なpuppeteerスクリプトを実行すると、この「ブラウザがダウンロードされません」というエラーが表示されるのはなぜですか?

  14. 14

    ファイルをダウンロードすると、ユーザーはログアウトされます

  15. 15

    ドロップダウンには、CSSHTMLでユーザーの画像と名前が表示されます

  16. 16

    ユーザーがGoogleCloudStorageから画像をダウンロードできるようにする方法

  17. 17

    インターネットから「大きな」ファイルをダウンロードするときに、LAN ネットワークがブロックまたは動作を停止します。何が原因でしょうか? (tcpdump 出力に STP メッセージが表示されます)

  18. 18

    Windows 7のChemAxonから大きなファイルをダウンロードするには、ファイル全体がダウンロードされていることを確認するにはどうすればよいですか?

  19. 19

    ファイルはChromeでダウンロードされますが、Safariではダウンロードされませんが、console.log(response)と[ネットワーク]タブには、サーバーから送信されているファイルが表示されます。

  20. 20

    iCloudから画像をダウンロードするときに「必要なプライマリゾーンがありません」エラー

  21. 21

    ユーザーが角度ドロップダウンメニューから空白の値を選択できるようにする方法はありますか

  22. 22

    Pixel 4a-すでにダウンロードされていると表示されているのに、ARCoreが見つかりません

  23. 23

    大きなテーブルを表示すると、HTMLテーブルヘッダーが常にウィンドウの上部に表示されます

  24. 24

    Angular6からPDFをダウンロードするSpringboot apiを呼び出すと、エラーが発生し、応答を解析できません

  25. 25

    一部のサブノードが現在のユーザーに対して禁止されているFirebaseデータベースノードをダウンロードすることはできますか?

  26. 26

    ユーザーが YouTube 動画をダウンロードできる Play ストアに Android アプリをアップロードできますか?

  27. 27

    NetBeansはリモートの場所からダウンロードされませんが、FTPをテストすることで成功します

  28. 28

    サービスから返される配列にバインドするドロップダウンリストを取得できません

  29. 29

    大きい解像度の画像のダウンロードが完了するまで、小さい解像度の画像をロードする

ホットタグ

アーカイブ