Подтвердить что ты не робот

Загрузите файл программно на 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();
4b9b3361

Ответ 1

Это какой-то рабочий код, который у меня есть для загрузки данного 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
  }
}

Ответ 3

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();
        }

    }

Ответ 4

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

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

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