С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Hank
64 / 55 / 5
Регистрация: 28.12.2011
Сообщений: 309
1

Progressbar при передаче файла на сервер

09.10.2015, 23:42. Просмотров 332. Ответов 6
Метки нет (Все метки)

Добрый день!

Имею код для отправки файла на сервер
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
public String sendPhoto(File file){
        String total = "";
        String fileName = file.getName();
 
        HttpURLConnection conn = null;
        DataOutputStream dos = null;
        String lineEnd = "\r\n";
        String twoHyphens = "--";
        String boundary = "*****";
        int bytesRead, bytesAvailable;
        byte[] buffer;
        int maxBufferSize = 1024;
 
        // open a URL connection to the Servlet
        try {
            FileInputStream fileInputStream = new FileInputStream(file);
 
            String urlSendPhoto = "my url";
            URL url = new URL(urlSendPhoto);
 
        // Open a HTTP  connection to  the URL
            conn = (HttpURLConnection) url.openConnection();
            conn.setDoInput(true); // Allow Inputs
            conn.setDoOutput(true); // Allow Outputs
            conn.setUseCaches(false); // Don't use a Cached Copy
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Connection", "Keep-Alive");
            conn.setRequestProperty("ENCTYPE", "multipart/form-data");
            conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
            conn.setRequestProperty("nameFile", fileName);
 
            dos = new DataOutputStream(conn.getOutputStream());
 
            dos.writeBytes(twoHyphens + boundary + lineEnd);
            dos.writeBytes("Content-Disposition: form-data; name="nameFile";filename=""
                    + fileName + """ + lineEnd);
            dos.writeBytes(lineEnd);
 
            // create a buffer of  maximum size
            bytesAvailable = fileInputStream.available();
            buffer = new byte[maxBufferSize];
            int startProcess = bytesAvailable;
            int progress = 0;
            while ((bytesRead = fileInputStream.read(buffer)) > 0) {
                dos.write(buffer, 0, bytesRead);
                progress += bytesRead;
               //тут производится обновление прогрессбара
            }
 
            // send multipart form data necesssary after file data...
            dos.writeBytes(lineEnd);
            dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
 
            // Responses from the server (code and message)
            fileInputStream.close();
            dos.flush();
            dos.close();
            InputStream inputStream = conn.getInputStream();
            InputStreamReader input = new InputStreamReader(inputStream);
            BufferedReader reader = new BufferedReader(input);
            int code = conn.getResponseCode();
            String line;
            while ((line = reader.readLine()) != null){
                total += line;
            }
            Log.i("uploadFile", "HTTP Response is : " + total);
 
        }
        catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (ProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
 
        return total;
с обновлением прогресса проблем нет, проблема в том, что выполнение программы тормозится на строке
Java
1
 InputStream inputStream = conn.getInputStream();
Поэтому получается ерунда - прогресс дошел до 100%, но программа все равно задумывается.
Если убираю эту строку, то файл на сервер не передается.
Читал на stackoverflow аналогичную тему, но там сообщество решение так не подсказало.
Может тут народ подскажет. Спасибо!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.10.2015, 23:42
Ответы с готовыми решениями:

Ошибка при передаче Parcel
Здраствуйте, пытаюсь через Parcel передать в другую активити обект и получаю...

Не передаются значения при их передаче в другое активити
Собственно, обработчик по клику в первом активти: Intent shopintent =...

При передаче текста в другую программу нужен только Bluetooth
При открытии списка программ в которые может быть отправлен текст из моей...

Обновление ProgressBar-a во время загрузки SQLite DB при включении приложения
Добрый день. Моя БД обновляется довольно долго поэтому хотелось бы показать...

Как перехватить пакет (запрос) данных при текущей передаче данных?
Хочу сделать на подобии валидации - что бы доступ к сети был только на...

6
CoolMind
422 / 404 / 66
Регистрация: 06.10.2012
Сообщений: 1,734
10.10.2015, 18:41 2
Hank, здравствуйте!
Что-то вы путаете. В первой части запроса вы передаёте методом POST файл. Во второй части запроса вы открываете входной поток и читаете ответ от сервера. Естественно, это занимает некоторое время.
0
Hank
64 / 55 / 5
Регистрация: 28.12.2011
Сообщений: 309
10.10.2015, 23:48  [ТС] 3
CoolMind,
В первой части запроса вы передаёте методом POST файл....
Я понимаю что выполняет мой код.
Естественно, что на получение ответа требуется время, но не так много, как на передачу файла. Возможно передача написана неправильно, а то файл в 3 МБайта передается очень быстро - цикл пробегает за считанные секунды, а на получении ответа останавливается на гораздо большее время. Еще смущает то, что при удалении строк с получением ответа перестает работать передача файла. Бред...
0
Armagedo
210 / 210 / 60
Регистрация: 22.08.2014
Сообщений: 644
11.10.2015, 11:15 4
http://stackoverflow.com/questions/1...tes-too-slowly
0
Hank
64 / 55 / 5
Регистрация: 28.12.2011
Сообщений: 309
12.10.2015, 12:02  [ТС] 5
В общем не помогает.
Попробовал указать
Java
1
conn.setRequestProperty("Connection", "close");
Java
1
System.setProperty("http.keepAlive", "false");
при указании
Java
1
conn.setRequestProperty("Content-Length", "1000");
вообще падает exceeded content-length limit of 75 bytes видимо неправильно размер указываю.
0
Valakin
434 / 100 / 15
Регистрация: 21.02.2015
Сообщений: 791
12.10.2015, 12:31 6
делай Progressbar на получение ответа, все будет по честному
0
Hank
64 / 55 / 5
Регистрация: 28.12.2011
Сообщений: 309
12.10.2015, 12:41  [ТС] 7
Цитата Сообщение от Valakin Посмотреть сообщение
делай Progressbar на получение ответа, все будет по честному
Да, мысль здравая, думал так сделать, но не понял как вычислять шаг обновления прогресса - тут ведь циклов никаких нет.
Была идея - перед получением ответа прогресс останавливается, скажем на 99%, а уже после получения обновляется до 100%. Но как-то сомнительно это, до 99% все работало шустро, а на последнем проценте все остановилось.
0
12.10.2015, 12:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.10.2015, 12:41

Расшифровать данные Wireshark. Ошибка при передаче файла на сервер
Доброго времени суток. Помогите расшифровать логи Wireshark. При передаче файла...

Шифрование данных при передаче на сервер
Есть задача передать данные на сервер. Получать и отправлять данные будет...

Клиент-сервер: При передаче одного кадра все хорошо, но при отсылке потоком возникает ряд ошибок
Добрый день, коллеги. Пишу клиент-серверное приложение для передачи потокового...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru