下载PDF文件并将其保存到SD卡

问题描述:

我从url写了这个代码下载pdf和文件url是这个 -下载PDF文件并将其保存到SD卡

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它会给错误“网络在主线程上”。凡我错了,现在我却不知道:(

代码这个

public void downloadFile(){   

    new Thread(new Runnable() { 

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

      } 
     }).start(); 


    } 

你的代码是正确的。现在你需要将您的PDF文件下载到外部存储器或任何你想下载并保存的地方

可能的原因是你想要不存在的文件夹首先检查它是否存在如果没有创建它然后创建文件输出流并写信给它。

+0

你在“目录”参数中发送了什么? – priyanka

+0

创建文件的路径。使用的代码在上面.. !! –

删除此代码并重试。

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

我认为URL.openConnection()有连接的描述了,所以c.connect()是没有必要的。

+0

我正在使用Thread.Please检查以上更新..! –

+0

它已经完成。发生错误是因为pdf url不正确.. !! –

+0

你的意思是'String fileURL =“http://www.vivekananda.net/PDFBooks/History_of_India.pdf”;'不正确?但我使用这个网址... – Kae10

我建议你使用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; 
    } 

} 
+0

我必须在文件参数中给出什么?如果你正在谈论在SD卡中创建的文件,所以它将是空的,直到文件下载。您可以发送完整的代码下载并保存在SD卡中的PDF然后打开它。 –

+0

它是保存下载的PDF的地方。检查它不存在是为了防止用户再次下载同一文件。在我的应用程序中,URL和文件名之间存在一对一的映射关系,因此如果文件存在,则该URL将在早期下载。 – Rediska