从Url下载pdf并将其保存到SD卡

时间:2015-12-30 05:51:01

标签: android download

我已经从pdf编写了此代码以供下载url,文件url就是这样 -

 String fileURL= "http://www.vivekananda.net/PDFBooks/History_of_India.pdf";

代码

  public static void DownloadFile(String fileURL, File directory) {

    try {

        FileOutputStream f = new FileOutputStream(directory);
        URL u = new URL(fileURL);
        HttpURLConnection c = (HttpURLConnection) u.openConnection();
        c.setRequestMethod("GET");
        c.setDoOutput(true);
        c.getResponseCode();
        c.connect();

        InputStream in = c.getInputStream();

        byte[] buffer = new byte[1024];
        int len1 = 0;
        while ((len1 = in.read(buffer)) > 0) {
            f.write(buffer, 0, len1);
        }
        f.close();
    } catch (Exception e) {
        e.printStackTrace();
    }

}

但这显示文件未找到异常,响应代码为405.我不知道为什么会这样。请帮助.. !!

这是我在SD卡中创建文件的代码 -

代码

  public void createPdfFile(){
        String extStorageDirectory = Environment.getExternalStorageDirectory()
                .toString();
                File folder = new File(extStorageDirectory, "pdf");
                folder.mkdir();
                 file = new File(folder, "storrage_data.pdf");
                try {
                    file.createNewFile();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }        
    }`

在此之后我从onResume()调用这样的线程中的下载方法;因为onCreate它会给出错误" Network On Main Thread"。我错了,现在我不知道:(

代码

 public void downloadFile(){        

     new Thread(new Runnable() {

            @Override
            public void run() {             
         Downloader.DownloadFile(url, file);
          showPdf();

            }
        }).start();   


    }

4 个答案:

答案 0 :(得分:1)

可能的原因是您不想存在的文件夹。首先检查它是否存在。如果没有,请创建它。然后创建fileoutputstream并写入它。

答案 1 :(得分:0)

您的代码是正确的。现在,您需要将pdf文件下载到外部存储器或您要下载并保存的位置。

答案 2 :(得分:0)

删除此代码,然后重试。

//c.setRequestMethod("GET"); //c.setDoOutput(true); //c.getResponseCode(); //c.connect();

我认为URL.openConnection()已经说明了连接,因此c.connect()不是必需的。

答案 3 :(得分:0)

我建议你使用DownloadManager。下载过程中可能会出现太多问题,无法自行处理所有问题。想想在下载过程中暂时失去连接性...... 下面是我从我的应用程序中提取的一些代码,并稍作修改,以摆脱您不需要的部分。

public void downloadAndOpenPdf(String url,final File file) {
    if(!file.isFile()) {
        DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
        DownloadManager.Request req = new DownloadManager.Request(Uri.parse(url));
        req.setDestinationUri(Uri.fromFile(file));
        req.setTitle("Some title");

        BroadcastReceiver receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                unregisterReceiver(this);
                if (file.exists()) {
                    openPdfDocument(file);
                }
            }
        };
        registerReceiver(receiver, new IntentFilter(
                DownloadManager.ACTION_DOWNLOAD_COMPLETE));
        dm.enqueue(req);
        Toast.makeText(this, "Download started", Toast.LENGTH_SHORT).show();
    }
    else {
        openPdfDocument(file);
    }
}

public boolean openPdfDocument(File file) {
    Intent target = new Intent(Intent.ACTION_VIEW);
    target.setDataAndType(Uri.fromFile(file), "application/pdf");
    target.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
    try {
        startActivity(target);
        return true;
    } catch (ActivityNotFoundException e) {
        Toast.makeText(this,"No PDF reader found",Toast.LENGTH_LONG).show();
        return false;
    }

}