2014-11-29 1 views
1

Я хочу загрузить файлы с сайта Zippyshare на Android.Загрузка файлов с Zippyshare в android

Проблема в том, что длина возвращаемой длины равна -1. Поэтому я не могу загрузить действительный файл.

Вот мой код

public class DownloadFileDemo1 extends Activity { 

ProgressBar pb; 
Dialog dialog; 
int downloadedSize = 0; 
int totalSize = 0; 
TextView cur_val; 
String dwnload_file_path = "http://www17.zippyshare.com/i/95748527/55444/image.jpeg"; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
      showProgress(dwnload_file_path); 

       new Thread(new Runnable() { 
        public void run() { 
         downloadFile(); 
        } 
        }).start(); 
} 

void downloadFile(){ 

    try { 
     URL url = new URL(dwnload_file_path); 
     HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
     urlConnection.setRequestProperty("Accept-Encoding", "gzip"); 
     urlConnection.setRequestMethod("GET"); 
     urlConnection.setDoOutput(true); 

     //connect 
     urlConnection.connect(); 

     //set the path where we want to save the file   
     File SDCardRoot = Environment.getExternalStorageDirectory(); 
     //create a new file, to save the downloaded file 
     File file = new File(SDCardRoot,"downloaded_file.png"); 

     FileOutputStream fileOutput = new FileOutputStream(file); 

     //Stream used for reading the data from the internet 
     InputStream inputStream = urlConnection.getInputStream(); 

     System.out.println("ENCODING"+urlConnection.getContentEncoding()); 

     if ("gzip".equals(urlConnection.getContentEncoding())) { 
      inputStream = new GZIPInputStream(inputStream); 
      } 
      InputSource is = new InputSource(inputStream); 

     //this is the total size of the file which we are downloading 
     totalSize = urlConnection.getContentLength(); 

     runOnUiThread(new Runnable() { 
      public void run() { 
       pb.setMax(totalSize); 
      }    
     }); 

     //create a buffer... 
     byte[] buffer = new byte[1024]; 
     int bufferLength = 0; 

     while ((bufferLength = inputStream.read(buffer)) > 0) { 
      fileOutput.write(buffer, 0, bufferLength); 
      downloadedSize += bufferLength; 
      // update the progressbar // 
      runOnUiThread(new Runnable() { 
       public void run() { 
        pb.setProgress(downloadedSize); 
        float per = ((float)downloadedSize/totalSize) * 100; 
        cur_val.setText("Downloaded " + downloadedSize + "KB/" + totalSize + "KB (" + (int)per + "%)"); 
       } 
      }); 
     } 
     //close the output stream when complete // 
     fileOutput.close(); 
     runOnUiThread(new Runnable() { 
      public void run() { 
       // pb.dismiss(); // if you want close it.. 
      } 
     });   

    } catch (final MalformedURLException e) { 
     showError("Error : MalformedURLException " + e);   
     e.printStackTrace(); 
    } catch (final IOException e) { 
     showError("Error : IOException " + e);   
     e.printStackTrace(); 
    } 
    catch (final Exception e) { 
     showError("Error : Please check your internet connection " + e); 
    }  
} 

void showError(final String err){ 
    runOnUiThread(new Runnable() { 
     public void run() { 
      Toast.makeText(DownloadFileDemo1.this, err, Toast.LENGTH_LONG).show(); 
     } 
    }); 
} 

void showProgress(String file_path){ 
    dialog = new Dialog(DownloadFileDemo1.this); 
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    dialog.setContentView(R.layout.myprogressdialog); 
    dialog.setTitle("Download Progress"); 

    TextView text = (TextView) dialog.findViewById(R.id.tv1); 
    text.setText("Downloading file from ... " + file_path); 
    cur_val = (TextView) dialog.findViewById(R.id.cur_pg_tv); 
    cur_val.setText("Starting download..."); 
    dialog.show(); 

    pb = (ProgressBar)dialog.findViewById(R.id.progress_bar); 
    pb.setProgress(0); 
    pb.setProgressDrawable(getResources().getDrawable(R.drawable.green_progress)); 
} 
} 

Как я могу решить эту проблему?

ответ

0

В соответствии с документацией getContentLength:

Возвращает длину содержимого в байтах, указанного заголовок ответа поля Content-Length или -1, если это поле не установлено или не может быть представлен как Int.

Если вы проверите вашу ссылку here, вы обнаружите, что длина контента не была установлена.

(я только добавить, что я не проверял полностью свой код, но, как правило, в основном цикле скачивания с буфером - загружает что-то, но я не проверял, было ли это правильно или нет)

EDIT : Я собираюсь «ненавидеть» парня, который дал мне «-1». Я помогаю с подробной ссылкой и как ее проверять, почему длина контента возвращается -1, а кто-то дает мне отрицательный результат. Я изменить немного функцию DownloadFile только для загрузки файла, не давая обновление пользовательского интерфейса, а затем мы имеем:

void downloadFile(){ 

    try { 
     URL url = new URL(dwnload_file_path); 
     HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
     urlConnection.setRequestProperty("Accept-Encoding", "gzip"); 
     urlConnection.setRequestMethod("GET"); 
     urlConnection.setDoOutput(true); 

     //connect 
     urlConnection.connect(); 

     //set the path where we want to save the file 
     //create a new file, to save the downloaded file 
     File file = new File("downloaded_file.png"); 

     FileOutputStream fileOutput = new FileOutputStream(file); 

     //Stream used for reading the data from the internet 
     InputStream inputStream = urlConnection.getInputStream(); 

     System.out.println("ENCODING"+urlConnection.getContentEncoding()); 

     if ("gzip".equals(urlConnection.getContentEncoding())) { 
      inputStream = new GZIPInputStream(inputStream); 
     } 
     InputSource is = new InputSource(inputStream); 

     //this is the total size of the file which we are downloading 
     totalSize = urlConnection.getContentLength(); 


     //create a buffer... 
     byte[] buffer = new byte[1024]; 
     int bufferLength = 0; 

     while ((bufferLength = inputStream.read(buffer)) > 0) { 
      fileOutput.write(buffer, 0, bufferLength); 
      downloadedSize += bufferLength; 
      // update the progressbar // 
     } 
     //close the output stream when complete // 
     fileOutput.close(); 


    } catch (final MalformedURLException e) { 
     e.printStackTrace(); 
    } catch (final IOException e) { 
     e.printStackTrace(); 
    } 
    catch (final Exception e) { 
     e.printStackTrace(); 
    } 
} 

Как я проверил этот код загружает файл, но это не образ, а HTML страницы из Zippyshare , так как zippy имеет некоторую защиту для загрузки файлов со своего сайта.

Смежные вопросы