Отправка большого файла по сети / локальному хосту - PullRequest
1 голос
/ 14 февраля 2012

Вот код:

private void sendFile(InputStream file, OutputStream out) throws IOException {
        Log.d(TAG, "trying to send file...");
        final int buffer_size = 4096;
        try {
            byte[] bytes = new byte[buffer_size];
            while(true) {
                int count = file.read(bytes, 0, buffer_size);
                if (count == -1) {                  
                    break;
                }
                out.write(bytes, 0, count);
                Log.d("copystream", bytes + "");
            }
        } catch (Exception e) {
            Log.e("copystream", "exception caught while sending file... " + e.getMessage());
        }
    }

Я пытаюсь отправить большой файл (файл InputStream) через выходной поток (OutputStream out).Этот код работает для небольших файлов, но для чего-то вроде 5 МБ и выше (я не измерял ограничение), он просто зависает через некоторое время без ошибок или чего-либо еще.

Log.d("copystream", bytes + ""); будет выводиться в течение некоторого времени, но в конечном итоге остановит запись в журнал.

Log.e("copystream", "exception caught while sending file... " + e.getMessage()); никогда не отображается.

Это часть большой кодовой базы, которая на самом деле является файловым сервером, работающим на устройстве Android.

Есть идеи?

Ответы [ 3 ]

1 голос
/ 06 марта 2012

Вот что заставило его работать:

while (true) {
  synchronized (buffer) {
    int amountRead = file.read(buffer);
    if (amountRead == -1) {
      break;
    }
    out.write(buffer, 0, amountRead);
  }
}
0 голосов
/ 14 февраля 2012

Используйте для этого класс AsyncTask, вот ссылка, например http://developer.android.com/reference/android/os/AsyncTask.html

0 голосов
/ 14 февраля 2012

Использовать Multipart POST.Что-то вроде

MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE, null,null); 
entity.addPart("File", new FileBody (new File(FILE_PATH), MIME_TYPE));
httppost.setEntity(entity); 
HttpResponse response = httpclient.execute(httppost); 
return response;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...