2015-04-23 2 views
0

Я пытаюсь загрузить файл с помощью браузера на Android-мобиле из моего веб-приложения (в моем случае я использую весенний mvc, несмотря на это, потому что я думаю, что это общая проблема,). Дело в том, что при попытке использовать хром или собственный браузер в Android-устройстве загрузка файла никогда не заканчивается, всегда появляется In progress или queue (в зависимости от версии для Android, я пробую с 4.1.1 и 5.1.1) в приложении для загрузки.Скачать файл с HTTPS в браузере на android

Я пытаюсь изменения типичный http-headers участие: Content-Type, Content-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 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

Я отправляю ответ, потому что я потратил некоторое время на поиск причины моей проблемы, и я надеюсь, что это может помочь кому-то.

Проблема, в конечном счете, вызвана сертификатом сервера, в котором развертывается мое веб-приложение, дело в том, что мой сертификат сервера выдается органом предварительного производства, который имеет промежуточную цепочку сертификатов, хэшированную слабым алгоритмом (md5). Кроме того, его CA находится в предварительном производстве, поэтому он не доверяет андроиду.

В рабочем столе файл загружается правильно, потому что ранее загрузки я пропустил страницу, которая предупреждает о проблеме с сертификатом сервера.

Дело в том, что на андроиде, по крайней мере с использованием хрома, появляется иконка предупреждения о сертификате сервера, и я пропускаю ее, однако затем в менеджере загрузки файл отображается в очереди или выполняется неопределенно долго, но нет сообщения об ошибке. Я трачу некоторое время на эту проблему, потому что у меня нет сообщения об ошибке или указания о том, что происходит.

Наконец-то я меняю свой сертификат сервера, и я использую правильный, выданный доверенным ЦС, и файлы начинают правильно загружаться для трех подходов кода, заданных в вопросе.

 Смежные вопросы

  • Нет связанных вопросов^_^