2017-11-30 9 views
0

유니버설 Android WebView App을 사용하여 웹 페이지에 액세스하는 앱을 만들고 있습니다. 이 웹 페이지에는 다운로드 가능한 pdfs가 있으며 로그인 한 사용자 만 사용할 수 있습니다. pdf가 플러그인에 의해 생성되고 http 응답으로 전송되기 때문에 기본 제공 다운로드 관리자가 작동하지 않습니다. 직접 연결을 구현하려고 시도했습니다.이 코드를 수정하려고 시도했습니다. http://www.codejava.net/java-se/networking/use-httpurlconnection-to-download-file-from-an-http-urlwebview에서 플러그인으로 생성 된 pdf 다운로드

제대로 작동하지만 연결이 제대로 설정되었지만받은 Content-Length가 -1이므로 파일이 다운로드되지 않습니다. 무엇이 문제 일 수 있습니까? 난 그냥 DownloadManager 내가 필요한 쿠키를 구성 할 수 있다는 것을 발견

public class HttpDownloadUtility extends AsyncTask<String, Integer, String> { 
private static final int BUFFER_SIZE = 4096; 

/** 
* Downloads a file from a URL 
* @param fileURL HTTP URL of the file to be downloaded 
* @param saveDir path of the directory to save the file 
* @throws IOException 
*/ 
public String downloadFile(String fileURL, String saveDir) throws IOException { 

    String fileName = ""; 
    URL url = new URL(fileURL); 

    HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(); 
    httpConn.setRequestProperty("Cookie", android.webkit.CookieManager.getInstance().getCookie("http://mywebsite.com")); 

    httpConn.connect(); 

    int responseCode = httpConn.getResponseCode(); 

    // always check HTTP response code first 
    if (responseCode == HttpURLConnection.HTTP_OK) { 

     String disposition = httpConn.getHeaderField("Content-Disposition"); 
     String contentType = httpConn.getContentType(); 
     int contentLength = httpConn.getContentLength(); 

     if (disposition != null) { 
      // extracts file name from header field 

      int index = disposition.indexOf("filename="); 
      if (index > 0) { 
       fileName = disposition.substring(index + 10, 
         disposition.length() - 1); 
      } 
     } else { 
      // extracts file name from URL 
      fileName = fileURL.substring(fileURL.lastIndexOf("/") + 1, 
        fileURL.length()); 
     } 

     System.out.println(url.toString()); 
     System.out.println("Content-Type = " + contentType); 
     System.out.println("Content-Disposition = " + disposition); 
     System.out.println("Content-Length = " + contentLength); 
     System.out.println("fileName = " + fileName); 

     // opens input stream from the HTTP connection 
     InputStream inputStream = httpConn.getInputStream(); 
     String saveFilePath = saveDir + File.separator + fileName; 

     // opens an output stream to save into file 
     FileOutputStream outputStream = new FileOutputStream(saveFilePath); 

     int bytesRead = -1; 
     byte[] buffer = new byte[BUFFER_SIZE]; 
     while ((bytesRead = inputStream.read(buffer)) != -1) { 
      outputStream.write(buffer, 0, bytesRead); 
     } 

     outputStream.close(); 
     inputStream.close(); 

     System.out.println("File downloaded"); 



    } else { 
     System.out.println("No file to download. Server replied HTTP code: " + responseCode); 
    } 
    httpConn.disconnect(); 

    return fileName; 
} 

@Override 
protected String doInBackground(String... url) { 

    String downloadedFile = ""; 

    try{ 
     downloadedFile = downloadFile(url[0], Environment.DIRECTORY_DOWNLOADS); 
    }catch(Exception e){ 
     System.out.println(e.toString()); 
    } 
    return downloadedFile; 
} 
} 

답변

0

:

여기에 코드입니다. 누군가가 그것을 필요로하는 경우에 대비해서 코드가 있습니다 (나는 더 이상 질문에서 언급 한 클래스를 사용하지 않습니다).

request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "mypdf.pdf"); 
       request.allowScanningByMediaScanner(); 
       request.setNotificationVisibility(1); 
       request.addRequestHeader("Cookie", CookieManager.getInstance().getCookie(url)); 
       DownloadManager manager = (DownloadManager)getActivity().getSystemService(Context.DOWNLOAD_SERVICE); 
       manager.enqueue(request);