Search code examples
androidwebviewandroid-download-managerdynamic-url

How to download a PDF from a dynamic URL in a webview


The URL to the PDF on the server is:

https://xyz.abc.com/qwer/leterpdf?Key=43,1&AppId=9520&usecaseID=195

Not ending with .pdf extension.
How do I download this in a WebView?


Solution

  • Depending on the technology you are using on server side, you can download a file forcing it passing appropriate headers. Like i am using PHP in my case & do it like this-

    $filepath = "pdfs/android.pdf";
    $length = filesize($filepath);
    header('Content-type: application/pdf');
    header('Content-Disposition: inline; filename="android.pdf"');
    header('Content-Transfer-Encoding: binary');
    header('Accept-Ranges: bytes');
    header("Content-Length: ".$length);
    

    Download Listener-

    w.setDownloadListener(new DownloadListener() {
                    public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimeType, long contentLength) {
    
                        String fileName,cookie;
                        try {
                            fileName = contentDisposition.replace("inline; filename=", "");
                            fileName = fileName.replaceAll("\"", "");
                            downloadFileAsync(url, fileName);
                        }catch (Exception e){
    
                        }
                    }
                });
    

    Download Code-

    private void downloadFileAsync(String url, String filename){
    
            new AsyncTask<String, Void, String>() {
                String SDCard;
    
                @Override
                protected void onPreExecute() {
                    super.onPreExecute();
                }
    
                @Override
                protected String doInBackground(String... params) {
                    try {
                        URL url = new URL(params[0]);
                        HttpURLConnection urlConnection = null;
                        urlConnection = (HttpURLConnection) url.openConnection();
                        urlConnection.setRequestMethod("GET");
                        urlConnection.setDoOutput(true);
                        urlConnection.connect();
                        int lengthOfFile = urlConnection.getContentLength();
                        SDCard = Environment.getExternalStorageDirectory() + File.separator + "downloads";
                        int k = 0;
                        boolean file_exists;
                        String finalValue = params[1];
                        do {
                            if (k > 0) {
                                if (params[1].length() > 0) {
                                    String s = params[1].substring(0, params[1].lastIndexOf("."));
                                    String extension = params[1].replace(s, "");
    
                                    finalValue = s + "(" + k + ")" + extension;
                                } else {
                                    String fileName = params[0].substring(params[0].lastIndexOf('/') + 1);
                                    String s = fileName.substring(0, fileName.lastIndexOf("."));
                                    String extension = fileName.replace(s, "");
                                    finalValue = s + "(" + k + ")" + extension;
                                }
                            }
                            File fileIn = new File(SDCard, finalValue);
                            file_exists = fileIn.exists();
                            k++;
                        } while (file_exists);
    
                        File file = new File(SDCard, finalValue);
                        FileOutputStream fileOutput = null;
                        fileOutput = new FileOutputStream(file, true);
                        InputStream inputStream = null;
                        inputStream = urlConnection.getInputStream();
                        byte[] buffer = new byte[1024];
                        int count;
                        long total = 0;
                        while ((count = inputStream.read(buffer)) != -1) {
                            total += count;
                            //publishProgress(""+(int)((total*100)/lengthOfFile));
                            fileOutput.write(buffer, 0, count);
                        }
                        fileOutput.flush();
                        fileOutput.close();
                        inputStream.close();
                    }catch (MalformedURLException e){
                        Log.d(AppConfig.APP_TAG, e.getMessage());
                    } catch (ProtocolException e){
                        Log.d(AppConfig.APP_TAG, e.getMessage());
                    } catch (FileNotFoundException e){
                        Log.d(AppConfig.APP_TAG, e.getMessage());
                    } catch (IOException e){
                        Log.d(AppConfig.APP_TAG, e.getMessage());
                    } catch (Exception e){
                        Log.d(AppConfig.APP_TAG, e.getMessage());
                    }
                    return params[1];
                }
                @Override
                protected void onPostExecute(final String result) {
    
                }
    
            }.execute(url, filename);
        }