2015-04-23 96 views
0

我想從我的web應用程序使用瀏覽器在Android手機上下載文件(在我的情況下,我使用彈簧mvc儘管在這,因爲我認爲這是一個常見的問題,而不是框架特定)。事情是,嘗試在Android設備的鉻或本地瀏覽器的文件下載永遠不會結束,總是出現在下載應用程序In progressqueue(取決於Android版本,我嘗試與4.1.1和5.1.1)。從Android的HTTPS在瀏覽器中下載文件

我試圖改變參與http-headersContent-Type,Content-Disposition與內聯或附件,指定Content-Length沒有運氣。

事情是,在Windows或Linux的桌面瀏覽器的文件下載正確的情況下。

我的一些嘗試:在@RequestMapping

@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); 
} 
  • 直接使用org.springframework.web.bind.annotation.ResponseBody返回文檔bytes[]produces = "application/pdf"

    1. 使用org.springframework.http.ResponseEntity

      @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); 
      
      } 
      
    2. 或寫在javax.servlet.http.HttpServletResponse OutputStream的文件,並指定標題:

      @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(); 
      } 
      

    的事情是,我說3例在Windows/Linux上的桌面瀏覽器中運行良好,惟未對鉻和原生瀏覽器android設備。

  • 回答

    1

    我張貼了答案,因爲我花了一些時間找到問題的原因,我希望這可以幫助某人。

    問題最終是由我的web應用程序部署的服務器證書引起的,問題在於我的服務器證書是由具有中間證書鏈的預生產證書頒發機構頒發的,該證書鏈使用弱算法(md5)散列。另外它的CA來自前期製作,因此它不被android所信任。

    在桌面文件下載正確,因爲之前的下載我跳過警告有關服務器證書問題的頁面。

    問題是,在android上,至少使用chrome關於服務器證書的警告頁面也會出現,然後我跳過它,然後在下載管理器中文件出現在隊列中或無限期地進行,但沒有錯誤消息。我花了一些時間解決這個問題,因爲我沒有任何錯誤信息或有關正在發生的事情。

    最後,我更改我的服務器證書,並使用由受信任的CA頒發的正確證書,並且文件開始針對問題指定的三種代碼方法正確下載。

    相關問題