Из моего приложения я загружаю файл на наш сервер, используя этот базовый код (это немного больше, чем это, конечно, но это в основном это)
HttpParams params = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(params, 15000);
HttpConnectionParams.setSoTimeout(params, 5 * 60 * 1000);
HttpClient client = new DefaultHttpClient(params);
HttpPost post = new HttpPost("upload url");
HttpEntity requestEntity = (new FileEntity(tmpFile, "multipart/form-data;boundary="+boundary);
post.setEntity(requestEntity);
HttpResponse response = (HttpResponse) client.execute(post);
Это прекрасно работает в то время.
Для некоторых телефонов под управлением Android 2.2+ файл, полученный на сервере сторона не завершена. Небольшие части файла просто отсутствуют, и отсутствующие части находятся в разных местах файла каждый раз.
Мы проверили это, сравнив файл с приложением с тем, что принимается на стороне сервера. На стороне сервера мы захватили пакеты с tcpdump, чтобы убедиться, что это не проблема с нашей сетью сервера или веб-сервера.
Мы также проверили данные с помощью tcpdump с телефона. Файл tcpdump с телефона отличается от данных, которые мы пытаемся отправить. В одном случае мы провели анализ файла tcpdump, так как отсутствуют данные между адресом 8d68 и 9000 из файла. Пакеты из tcpdump выстраиваются в линию с этими адресами (один пакет имеет часть данных до 8d68, а затем следующий пакет имеет данные, начиная с 9000).
Для этих телефонов проблема возникает только некоторое время. Иногда файл загружает работу, и весь файл получен без изменений на нашем конце.
Это происходит ТОЛЬКО для телефонов с поддержкой 2.2+. Это происходит в широком разнообразии телефонов и различных носителей, а также для сотен пользователей. Похоже, что это происходит как на Wi-Fi, так и на 3g на основе IP-адресов, видимых на стороне сервера.
Это анекдотично, но, пытаясь заставить это произойти на моем Nexus за последние 2 дня, я видел, как это происходит 6 раз, и те времена всегда были правы, когда я вхожу или выхожу из комнаты близко к определенному Wi-Fi-маршрутизатору, Остальная часть дня, когда я нахожусь в офисе на другом Wi-Fi-маршрутизаторе или в сети сотовой связи, проблема никогда не возникает. Моя теория заключается в том, что приложение занято отправкой данных, и теперь мы переходим от Wi-Fi к сотовой сети или наоборот, является ли это немой идеей или возможностью?
Я могу поместить файлы tcpdump и файлы данных куда-нибудь, если кому-то нужно взглянуть.
Что еще я должен исследовать, чтобы выяснить причину этого?
У меня возникла аналогичная проблема при загрузке двоичных данных. Я понял, что это проблема с кодом сервера. На стороне сервера были некоторые фильтры, которые читали входящие запросы и пытались их зарегистрировать. Код пытался поместить входящий поток в некоторый тип String DS. Из-за этого бинарные изображения были искажены. Просто проверьте, есть ли какие-либо фильтры на стороне сервера. Надеюсь, что это поможет