AndroidのブラウザでHTTPSからファイルをダウンロードします

albciff

私は自分のウェブアプリからAndroidモバイルのブラウザを使用してファイルをダウンロードしようとしています(私の場合はSpring MVCを使用していますが、フレームワーク固有ではなく一般的な問題だと思うので、これにも関わらず)。問題は、AndroidデバイスでChromeまたはネイティブブラウザを試してみると、ファイルのダウンロードが終了せず、常に表示されるIn progressqueue、ダウンロードアプリで(Androidのバージョンによっては4.1.1と5.1.1で試してみます)ということです。

私は典型的なhttp-headers関係を変更しようとしています:Content-TypeContent-Dispositionインラインまたはアタッチメントを使用Content-Lengthして、運がないこと指定します。

重要なのは、WindowsまたはLinuxのデスクトップブラウザでは、いずれの場合もファイルが正しくダウンロードされるということです。

私の試みのいくつか:

  1. 使用org.springframework.http.ResponseEntity

    @RequestMapping(value= {"/evidenciaDownload"},method = RequestMethod.GET)
    public ResponseEntity<byte[]> getEvidencia(
            @RequestParam(value = "paramsCoded", required = true) String paramsCoded) throws IOException {
    
        String url = configPropsService.getEvidenciaUrlDownload() + URLEncoder.encode(paramsCoded,"UTF-8");
        logger.info("[getEvidencia] Recuperem l'evidencia de : " + url);
    
        // bytes are correct
        byte[] evidencia = downloadFile(url);
    
        HttpHeaders responseHeaders = new HttpHeaders();
        responseHeaders.set("Content-Type", "application/pdf");
        //responseHeaders.set("Content-Disposition","attachment; filename=\"evidencia.pdf\";");
        responseHeaders.set("Content-Disposition","inline; filename=evidencia.pdf");
        responseHeaders.setContentLength(evidencia.length);
        return new ResponseEntity<byte[]>(evidencia, responseHeaders,HttpStatus.CREATED);
    }
    
  2. 直接使用してorg.springframework.web.bind.annotation.ResponseBodyドキュメントを返すためにbytes[]、そしてproduces = "application/pdf"@RequestMapping

    @RequestMapping(value= {"/evidenciaDownload"},method = RequestMethod.GET, produces = "application/pdf")
    public @ResponseBody byte[] getEvidencia(
            @RequestParam(value = "paramsCoded", required = true) String paramsCoded) throws IOException {
    
        String url = configPropsService.getEvidenciaUrlDownload() + URLEncoder.encode(paramsCoded,"UTF-8");
        logger.info("[getEvidencia] Recuperem l'evidencia de : " + url);
    
        return downloadFile(url);
    
    }
    
  3. または、javax.servlet.http.HttpServletResponse出力ストリームにファイルを書き込み、ヘッダーを指定します。

    @RequestMapping(value= {"/documentDownload"},method = RequestMethod.GET)
    public void getDocument(
            @RequestParam(value = "paramsCoded", required = true) String paramsCoded, 
            HttpServletResponse response) throws IOException {
    
        String url = configPropsService.getDocumentsNotficacioUrlDownload() + URLEncoder.encode(paramsCoded,"UTF-8");       
        logger.info("[getDocument] Recuperem el document de : " + url);
    
        // bytes are correct
        byte[] downloadFile = downloadFile(url);
    
        ServletOutputStream outputStream = response.getOutputStream();
    
        int fileLength = IOUtils.copy(new ByteArrayInputStream(downloadFile), outputStream);
        response.setHeader("Content-Disposition","attachment;filename=\"evidencia.pdf\"");
        response.setContentLength(fileLength);
        response.setContentType("application/pdf");
        outputStream.flush();
        outputStream.close();
    }
    

私が言ったように、Windows / Linuxのデスクトップブラウザでは3つのケースがうまく機能しますが、AndroidデバイスのChromeやネイティブブラウザではうまく機能しません。

albciff

私は自分の問題の原因を見つけるのに時間を費やしているので、答えを投稿します。これが誰かの助けになることを願っています。

この問題は、最終的にWebアプリが展開されているサーバー証明書によって引き起こされます。サーバー証明書は、弱いアルゴリズム(md5)でハッシュされた中間証明書チェーンを持つ運用前の認証局によって発行されます。また、そのCAはプリプロダクションのものであるため、Androidでは信頼されていません。

デスクトップでは、以前にダウンロードしたため、サーバー証明書の問題について警告しているページをスキップしたため、ファイルが正しくダウンロードされます。

アンドロイドでは、少なくともクロームを使用すると、サーバー証明書に関する警告ページも表示され、スキップしますが、ダウンロードマネージャーでは、ファイルはキューに表示されるか、無期限に進行中ですが、エラーメッセージは表示されません。エラーメッセージや何が起こっているのかについての指示がないので、私はこの問題にしばらく時間を費やしています。

最後に、サーバー証明書を変更し、信頼できるCAによって発行された正しい証明書を使用すると、質問で指定された3つのコードアプローチに対してファイルが正しくダウンロードされ始めます。

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

ブラウザで圧縮ファイルをgolangサーバーからダウンロードします

分類Dev

Androidのブラウザからファイルをダウンロードする際の問題

分類Dev

ブラウザのURLでS3からファイルをダウンロードできません

分類Dev

WebブラウザからDjangoダウンロード添付ファイルを取得します

分類Dev

PythonでWebURLを使用してファイルをダウンロードする方法は?ブラウザからのダウンロードは機能しますが、Pythonのリクエストからは機能しません

分類Dev

ブラウザなしでフォームを送信してウェブサイトからファイルをダウンロードする方法

分類Dev

Goサーバーからブラウザーでファイルをダウンロードする方法

分類Dev

RestWebサービスを介してサーバー上のブラウザーファイルストアからダウンロードします

分類Dev

jQueryを使用してブラウザから複数のファイルをダウンロードすることに制限はありますか?

分類Dev

ZIPファイルをダウンロードし、ブラウザASP.NETMVCでRotativaPDFを出力します

分類Dev

AndroidのGoogleドライブからファイルをダウンロード

分類Dev

いずれかのブラウザがAndroidにファイルを保存すると、ブロードキャストが送信されますか?Androidのブラウザで保存/ダウンロードしたファイルを傍受するにはどうすればよいですか?

分類Dev

RのGoogleドライブからxlsxファイルをダウンロードします

分類Dev

サイトユーザーが選択したGoogleドライブから(非公開の)ファイルをダウンロードできません

分類Dev

ブラウザはDOCTYPE.dtdファイルをダウンロードしますか?

分類Dev

Officeのインストールでは、ブラウザからダウンロードしたファイルは開かれません

分類Dev

AndroidデバイスのGoogleChromeブラウザのnode.jsサーバーからファイルをダウンロードする際のバグ

分類Dev

ASP.NETからユーザーのブラウザのデフォルトダイアログにGoogleドライブファイルをダウンロードします

分類Dev

Firebaseクラウド機能:FTPアカウントからファイルを取得し、ブラウザにダウンロードする方法

分類Dev

ファイルをダウンロードしますが、ブラウザでやらなければならないようです

分類Dev

Nexusからビルドファイルをダウンロードします。wgetの実行時に証明書エラーが発生しますが、ブラウザ(Firefox、Chrome)では成功します。

分類Dev

ブラウザで開いた光沢のあるアプリからダウンロードしたプロットファイルのファイル名を変更します

分類Dev

Ajaxメソッドを使用してExcelファイルをダウンロードする方法-ここで私のファイルはブラウザにダウンロードされていないTempフォルダにダウンロードされますか?

分類Dev

ブラウザにURLからCSVとしてファイルをダウンロードするように強制します

分類Dev

Azure BlobStorageからブラウザーにファイルをダウンロードする方法

分類Dev

選択したファイルをGoogleドライブからダウンロードします

分類Dev

ブラウザから.ogg、.wavなどのファイルをダウンロードするにはどうすればよいですか?

分類Dev

Seleniumjavaを使用してChromeブラウザでPDFファイルをダウンロードできません

分類Dev

Pyodideで作成したファイルをブラウザでコピー/ダウンロードする方法は?

Related 関連記事

  1. 1

    ブラウザで圧縮ファイルをgolangサーバーからダウンロードします

  2. 2

    Androidのブラウザからファイルをダウンロードする際の問題

  3. 3

    ブラウザのURLでS3からファイルをダウンロードできません

  4. 4

    WebブラウザからDjangoダウンロード添付ファイルを取得します

  5. 5

    PythonでWebURLを使用してファイルをダウンロードする方法は?ブラウザからのダウンロードは機能しますが、Pythonのリクエストからは機能しません

  6. 6

    ブラウザなしでフォームを送信してウェブサイトからファイルをダウンロードする方法

  7. 7

    Goサーバーからブラウザーでファイルをダウンロードする方法

  8. 8

    RestWebサービスを介してサーバー上のブラウザーファイルストアからダウンロードします

  9. 9

    jQueryを使用してブラウザから複数のファイルをダウンロードすることに制限はありますか?

  10. 10

    ZIPファイルをダウンロードし、ブラウザASP.NETMVCでRotativaPDFを出力します

  11. 11

    AndroidのGoogleドライブからファイルをダウンロード

  12. 12

    いずれかのブラウザがAndroidにファイルを保存すると、ブロードキャストが送信されますか?Androidのブラウザで保存/ダウンロードしたファイルを傍受するにはどうすればよいですか?

  13. 13

    RのGoogleドライブからxlsxファイルをダウンロードします

  14. 14

    サイトユーザーが選択したGoogleドライブから(非公開の)ファイルをダウンロードできません

  15. 15

    ブラウザはDOCTYPE.dtdファイルをダウンロードしますか?

  16. 16

    Officeのインストールでは、ブラウザからダウンロードしたファイルは開かれません

  17. 17

    AndroidデバイスのGoogleChromeブラウザのnode.jsサーバーからファイルをダウンロードする際のバグ

  18. 18

    ASP.NETからユーザーのブラウザのデフォルトダイアログにGoogleドライブファイルをダウンロードします

  19. 19

    Firebaseクラウド機能:FTPアカウントからファイルを取得し、ブラウザにダウンロードする方法

  20. 20

    ファイルをダウンロードしますが、ブラウザでやらなければならないようです

  21. 21

    Nexusからビルドファイルをダウンロードします。wgetの実行時に証明書エラーが発生しますが、ブラウザ(Firefox、Chrome)では成功します。

  22. 22

    ブラウザで開いた光沢のあるアプリからダウンロードしたプロットファイルのファイル名を変更します

  23. 23

    Ajaxメソッドを使用してExcelファイルをダウンロードする方法-ここで私のファイルはブラウザにダウンロードされていないTempフォルダにダウンロードされますか?

  24. 24

    ブラウザにURLからCSVとしてファイルをダウンロードするように強制します

  25. 25

    Azure BlobStorageからブラウザーにファイルをダウンロードする方法

  26. 26

    選択したファイルをGoogleドライブからダウンロードします

  27. 27

    ブラウザから.ogg、.wavなどのファイルをダウンロードするにはどうすればよいですか?

  28. 28

    Seleniumjavaを使用してChromeブラウザでPDFファイルをダウンロードできません

  29. 29

    Pyodideで作成したファイルをブラウザでコピー/ダウンロードする方法は?

ホットタグ

アーカイブ