2011-03-29 133 views
10

有誰知道如何通過WiFi將文件從網絡服務器(本地主機)保存到SD卡?如何將文件從網站保存到SD卡

我正在做xml解析到我的應用程序,爲此我必須從本地主機下載xml文件到SD卡,然後標記解析。我堅持下載一個XML文件到SD卡。請指導我如何做到這一點..

回答

42

您可以使用此方法來從互聯網上下載文件到您的SD卡:

public void DownloadFromUrl(String DownloadUrl, String fileName) { 

    try { 
      File root = android.os.Environment.getExternalStorageDirectory();    

      File dir = new File (root.getAbsolutePath() + "/xmls"); 
      if(dir.exists()==false) { 
       dir.mkdirs(); 
      } 

      URL url = new URL(DownloadUrl); //you can write here any link 
      File file = new File(dir, fileName); 

      long startTime = System.currentTimeMillis(); 
      Log.d("DownloadManager", "download begining"); 
      Log.d("DownloadManager", "download url:" + url); 
      Log.d("DownloadManager", "downloaded file name:" + fileName); 

      /* Open a connection to that URL. */ 
      URLConnection ucon = url.openConnection(); 

      /* 
      * Define InputStreams to read from the URLConnection. 
      */ 
      InputStream is = ucon.getInputStream(); 
      BufferedInputStream bis = new BufferedInputStream(is); 

      /* 
      * Read bytes to the Buffer until there is nothing more to read(-1). 
      */ 
      ByteArrayBuffer baf = new ByteArrayBuffer(5000); 
      int current = 0; 
      while ((current = bis.read()) != -1) { 
       baf.append((byte) current); 
      } 


      /* Convert the Bytes read to a String. */ 
      FileOutputStream fos = new FileOutputStream(file); 
      fos.write(baf.toByteArray()); 
      fos.flush(); 
      fos.close(); 
      Log.d("DownloadManager", "download ready in" + ((System.currentTimeMillis() - startTime)/1000) + " sec"); 

    } catch (IOException e) { 
     Log.d("DownloadManager", "Error: " + e); 
    } 

} 

您需要下列權限添加到您的AndroidManifest.xml:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> 
<uses-permission android:name="android.permission.INTERNET"></uses-permission> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> 
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission> 
+0

這真是太棒了...還有一個問題,你知道如何以不可見模式存儲文件。 (即)存儲文件永遠不會被用戶看到。 – RAAAAM 2011-03-30 04:33:33

+0

對不起,我對此沒有任何意見。也許[這篇文章會幫助](http://stackoverflow.com/questions/1129644/how-to-make-a-file-hidden-in-android-sd-card) – Sourav 2011-03-30 06:23:33

+0

@HariRam:你可能想要把或在AsyncTask或新的Thread中調用這個方法。這樣,下載過程對用戶是隱藏的。 – 2011-12-05 06:41:08

0

我更喜歡建立肥皂服務器,並從應用程序到服務器,並通過接收XML的調用。或者,也許你可以創建一個生成XML的URL,並直接解析URL。

嘗試閱讀更多關於這個LINK

希望我回答這個問題。否則會很樂意幫助,但我需要更詳細的功能描述。

+0

謝謝你,我的問題是我想保存這是從我的本地主機服務器駐留到SD卡上的XML文件。只是爲了保存。 – RAAAAM 2011-03-29 12:30:43

+0

嘿,要做到這一點,我建議只做一個靜態PHP下載腳本([鏈接](http://www.ryboe.com/tutorials/php-headers-force-download)),而不是簡單地從URL下載做你的手機,你設置了SD卡路徑... – 2011-03-30 08:42:29

1

的Sourav的答案是可以的,但對於大文件大小,您應該在新線程上實現它;因爲在下載時,主線程忙於下載文件。如果等待時間超出預期,系統將生成「無響應」錯誤。

爲了做到這一點,你可以用「TaskAsync」或「IntentService