2012-04-11 1 views
2

Я пытаюсь загрузить zip-файл в android, а затем извлечь zip-файл. Я отлаживаю свой код и возникает смешная проблема: Загруженный zip-файл немного больше исходного файла. И загруженный zip-файл не может быть распакован winrar. Говорят, что загруженный файл заканчивается ошибкой. (... Файл почтового индекса на моем сайте в порядке, я пытаюсь скачать с IE Это работает отлично) Ниже мой код:Как скачать zip-файл с java-кодом в android правильно?

public void download(final String url, final String savePath, final String saveName) { 
    new Thread(new Runnable() { 
     public void run() { 
      try { 
       sendMessage(FILE_DOWNLOAD_CONNECT); 
       URL sourceUrl = new URL(url); 
       URLConnection conn = sourceUrl.openConnection(); 
       conn.connect(); 
       InputStream inputStream = conn.getInputStream(); 

       int fileSize = conn.getContentLength(); 

       File savefilepath = new File(savePath); 
       if (!savefilepath.exists()) { 
        savefilepath.mkdirs(); 
       } 
       File savefile = new File(savePath+saveName); 
       if (savefile.exists()) { 
        savefile.delete(); 
       } 
       savefile.createNewFile(); 

       FileOutputStream outputStream = new FileOutputStream(
        savePath+saveName, true); 

       byte[] buffer = new byte[1024]; 
       int readCount = 0; 
       int readNum = 0; 
       int prevPercent = 0; 
       while (readCount < fileSize && readNum != -1) { 
        readNum = inputStream.read(buffer); 
        if (readNum > -1) { 
         outputStream.write(buffer); 

         readCount = readCount + readNum; 

         int percent = (int) (readCount * 100/fileSize); 
         if (percent > prevPercent) { 
          sendMessage(FILE_DOWNLOAD_UPDATE, percent, 
           readCount); 

          prevPercent = percent; 
         } 
        } 
       } 
       outputStream.flush(); 
       outputStream.close(); 
       inputStream.close(); 
       //Thread.sleep(50); 
       sendMessage(FILE_DOWNLOAD_COMPLETE, savePath); 

      } catch (Exception e) { 
       sendMessage(FILE_DOWNLOAD_ERROR, e); 
      } 
     } 
    }).start(); 
} 

Кто-нибудь знает эту проблему?

+0

Я попытался решения, описанные раньше: [ссылка] (http://stackoverflow.com/questions/9324103/download-and-extract-zip-file-in-android). Но та же проблема есть. – David

+0

Еще одна забавная проблема. Загруженный размер файла изменится после повторной загрузки (не каждый раз). Я предполагаю, что это может быть вызвано стратегией буфера файлов в Android. Поэтому я пытаюсь //Thread.sleep(50); чтобы андроид полностью сохранил файл. Но, похоже, это не сработает. (Почтовый файл необходимо извлечь сразу после загрузки.) – David

ответ

5

Когда вы читаете в буфер, вы пишете весь буфер в выходной поток:

outputStream.write(buffer); 

Вы должны написать только часть буфера, которая была заполнена:

outputStream.write(buffer, 0, readNum); 

Особенно с сетевыми загрузками, нет гарантии, что вызов inputStream.read(buffer) заполнит буфер (даже если в файл будет больше 1024 байта).

+0

Привет, Тед. Ты прав! Он работает нормально. Я должен был подумать об этом. Я так глуп. :) – David

2
public class Download extends Activity { 
public static final int DIALOG_DOWNLOAD_PROGRESS = 0; 

private ProgressDialog mProgressDialog; 
    public String app_name ; 
    public String urlpath ; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 



app_name="test.rar";   
    urlpath = "https://www.abc.com/download/"+ app_name; 
    if (android.os.Environment.getExternalStorageState().equals 
      (android.os.Environment.MEDIA_MOUNTED)) 
    {   
     startDownload(); 
    } 

    else 
    { 
     Toast.makeText(getApplicationContext(), "SD Card not found,Insert SD card and try again", Toast.LENGTH_SHORT).show(); 
    } 

} 

private void startDownload() { 

    new DownloadFileAsync().execute(urlpath); 
} 
@Override 
protected Dialog onCreateDialog(int id) { 
    switch (id) { 
     case DIALOG_DOWNLOAD_PROGRESS: 
      mProgressDialog = new ProgressDialog(this); 
      mProgressDialog.setMessage("Downloading Updates.."); 
      mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
      mProgressDialog.setCancelable(false); 
      mProgressDialog.setIndeterminate(false); 
      mProgressDialog.setMax(100); 
      mProgressDialog.show(); 
      return mProgressDialog; 
     default: 
      return null; 
    } 
} 
class DownloadFileAsync extends AsyncTask<String, String, String> { 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     showDialog(DIALOG_DOWNLOAD_PROGRESS); 
    } 

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


     try { 


      URL url = new URL(urlpath.toString()); // Your given URL. 

      HttpURLConnection c = (HttpURLConnection) url.openConnection(); 
      c.setRequestMethod("GET"); 
      c.setDoOutput(true); 
      c.connect(); // Connection Complete here.! 


      int lenghtOfFile = c.getContentLength(); 


      Log.d("Downloading Updates", "Lenght of file: " + lenghtOfFile); 

      String PATH = Environment.getExternalStorageDirectory() + "/download/"; 

      File file = new File(PATH); // PATH = /mnt/sdcard/download/ 

      if (!file.exists()) { 
       file.mkdirs(); 
      } 
      File outputFile = new File(file, app_name);   
      FileOutputStream fos = new FileOutputStream(outputFile); 



      InputStream is = c.getInputStream();/

      byte[] buffer = new byte[1024]; 
      int len1 = 0; 
      long total = 0; 
      while ((len1 = is.read(buffer)) != -1) { 
       total += len1; 
       publishProgress(""+(int)((total*100)/lenghtOfFile)); 

       fos.write(buffer, 0, len1); // Write In FileOutputStream. 
      } 
      fos.flush(); 
      fos.close(); 
      is.close(); 
     } catch (Exception e) {} 
     return null; 

    } 
    protected void onProgressUpdate(String... progress) { 
     Log.d("Downloading Updates",progress[0]); 
     mProgressDialog.setProgress(Integer.parseInt(progress[0])); 
    } 

    @Override 
    protected void onPostExecute(String unused) { 
     dismissDialog(DIALOG_DOWNLOAD_PROGRESS); 
     finish(); 
    } 
} 
} 
+0

Спасибо Deepsan. – David

+0

Это работа для zip или rar? – albert