2009-11-11 3 views
16

Я программно загружаю файлы с веб-сервера. После завершения загрузки я проверил файл. Размер, расширение и все остальные параметры верны, но когда я пытаюсь воспроизвести этот файл в медиаплеере, он показывает, что он поврежден.Загрузите файл программно на Android

Вот мой код:

byte[] b = null; 
    InputStream in = null; 
    b = new byte[Integer.parseInt(size)]; // size of the file. 
    in = OpenHttpConnection(URL);    
    in.read(b); 
    in.close(); 

    File folder = new File("/sdcard", "folder"); 
    boolean check = folder.mkdirs(); 

    Log.d("HttpDownload", "check " + check); 

    File myFile = new File("/sdcard/folder/" + name); 


    myFile.createNewFile(); 
    OutputStream filoutputStream = new FileOutputStream(myFile); 

    filoutputStream.write(b); 

    filoutputStream.flush(); 

    filoutputStream.close(); 

ответ

25

Это какой-то рабочий код, который у меня есть для загрузки данного URL-адреса в данный объект File. Объект File (outputFile) только что был создан с использованием нового файла (путь), я не вызывал createNewFile или что-то еще.

private static void downloadFile(String url, File outputFile) { 
    try { 
     URL u = new URL(url); 
     URLConnection conn = u.openConnection(); 
     int contentLength = conn.getContentLength(); 

     DataInputStream stream = new DataInputStream(u.openStream()); 

     byte[] buffer = new byte[contentLength]; 
     stream.readFully(buffer); 
     stream.close(); 

     DataOutputStream fos = new DataOutputStream(new FileOutputStream(outputFile)); 
     fos.write(buffer); 
     fos.flush(); 
     fos.close(); 
    } catch(FileNotFoundException e) { 
     return; // swallow a 404 
    } catch (IOException e) { 
     return; // swallow a 404 
    } 
} 
+0

можно ли скачать видео с такой же ?? –

+1

Это для загрузки файлов. Вы можете скачать видеофайлы, конечно. Но если вы имеете в виду потоковое видео, нет, вы хотите использовать для этого разные API. – Konklone

+1

Как я могу создать выходной файл для передачи? – Vasant

0

чтение входного потока не гарантирует, что все содержимое файла будет снесено за один раз. Проверьте возвращаемое значение на in.read (b); линия. Это может выглядеть примерно так:

if(in.read(b) != size) 
    Log.e("Network","Failed to read all data!"); 

Что вам скажет, по крайней мере, если вы получаете все данные из сетевого уровня. Если вы получили только частичное чтение, но вы все еще записываете полный массив байтов на диск, это может объяснить, почему медиаплеер считает, что файл поврежден.

1
private void down(String string) 
    { 

     try 
     { 
      URL url = new URL(URL); 
      HttpURLConnection c = (HttpURLConnection) url.openConnection(); 
      c.setRequestMethod("GET"); 
      c.setDoOutput(true); 
      c.connect(); 

      String PATH = Environment.getExternalStorageDirectory().toString() 
        + "/load"; 
      Log.v("LOG_TAG", "PATH: " + PATH); 

      File file = new File(PATH); 
      file.mkdirs(); 
      File outputFile = new File(file, option14[i].toString()); 
      FileOutputStream fos = new FileOutputStream(outputFile); 
      InputStream is = c.getInputStream(); 

      byte[] buffer = new byte[4096]; 
      int len1 = 0; 

      while ((len1 = is.read(buffer)) != -1) 
      { 
       fos.write(buffer, 0, len1); 
      } 

      fos.close(); 
      is.close(); 

      Toast.makeText(this, " A new file is downloaded successfully", 
        Toast.LENGTH_LONG).show(); 

     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 

    } 
+0

это сработало для меня! Спасибо. но можете ли вы объяснить эту строку: byte [] buffer = new byte [4096]; ? это максимальное количество байтов, разрешенных для файла? –

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