Поскольку разработчики Android рекомендуют использоватьHttpURLConnection
класс, мне было интересно, может ли кто-нибудь предоставить мне хороший пример того, как отправить «файл» растрового изображения (фактически поток в памяти) через POST на HTTP-сервер Apache. Меня не интересуют файлы cookie, аутентификация или что-то сложное, но я просто хочу иметь надежную и логичную реализацию. Все примеры, которые я видел здесь, больше похожи на «давайте попробуем это, и, возможно, это сработает».
Прямо сейчас у меня есть этот код:
URL url;
HttpURLConnection urlConnection = null;
try {
url = new URL("http://example.com/server.cgi");
urlConnection = (HttpURLConnection) url.openConnection();
} catch (Exception e) {
this.showDialog(getApplicationContext(), e.getMessage());
}
finally {
if (urlConnection != null)
{
urlConnection.disconnect();
}
}
где showDialog должен просто отображать AlertDialog
(в случае недопустимого URL?).
Теперь предположим, что я генерирую растровое изображение следующим образом: Bitmap image = this.getBitmap()
внутри элемента управления, производного от, View
и я хочу отправить его через POST. Какой была бы правильная процедура для достижения такого результата? Какие классы мне нужно использовать? Могу ли я использовать HttpPost
подобное в этом примере ? Если да, то как мне создать изображение InputStreamEntity
для моего растрового изображения? Мне было бы противно потребовать сначала сохранить растровое изображение в файле на устройстве.
Я также должен упомянуть, что мне действительно нужно отправлять на сервер каждый неизмененный пиксель исходного растрового изображения, поэтому я не могу преобразовать его в JPEG.
источник
Ответы:
Я понятия не имею, почему
HttpURLConnection
класс не предоставляет никаких средств для отправки файлов без необходимости вручную составлять оболочку файла. Вот что я в итоге сделал, но если кто-то знает лучшее решение, дайте мне знать.Входные данные:
Статический материал:
Настройте запрос:
Запустить оболочку содержимого:
Преобразовать
Bitmap
вByteBuffer
:Конечная оболочка содержимого:
Очистить выходной буфер:
Получите ответ:
Закрыть поток ответов:
Закройте соединение:
PS: Конечно, мне пришлось обернуть запрос
private class AsyncUploadBitmaps extends AsyncTask<Bitmap, Void, String>
, чтобы сделать платформу Android счастливой, потому что она не любит иметь сетевые запросы в основном потоке.источник
url
переменной, например , так:URL url = new URL("http://example.com/?param1=val1¶m2=val2");
. Вы можете добавлять сколько угодно (хотя я думаю, что есть некоторые ограничения).Я действительно нашел лучший способ отправлять файлы с помощью HttpURLConnection, используя MultipartEntity
Предполагая, что вы загружаете изображение с растровыми данными:
И вуаля! Данные вашего сообщения будут содержать поле изображения вместе с именем файла и путем на вашем сервере.
источник
Чтобы загрузить файл на сервер с каким-либо параметром,
MultipartUtility
просто используйте.MultipartUtility.java
Для
upload
васfile
вместе с параметрами.ПРИМЕЧАНИЕ: поместите этот код ниже в не-пользовательский поток, чтобы получить ответ.
источник
Решение Jaydipsinh Zala у меня не сработало, я не знаю почему, но, похоже, оно близко к решению.
Итак, объединив это с отличным решением и объяснением Михая Тодора , в результате получился класс, который сейчас работает для меня. Если это кому-то поможет:
MultipartUtility2V.java
источник
Этот ответ https://stackoverflow.com/a/33149413/6481542 дал мне 90% пути с загрузкой больших файлов на сервер Django разработки, но мне пришлось использовать setFixedLengthStreamingMode, чтобы он работал. Это требует установки Content-Length перед записью контента, что требует довольно значительной переписывания приведенного выше ответа. Вот мой конечный результат
Использование во многом такое же, как в приведенном выше ответе, но я включил поддержку CSRF, которую Django использует по умолчанию с формами.
источник
на основе решения Михая, если у кого-то есть проблема с сохранением изображений на сервере, как это произошло на моем сервере. измените Bitmap на часть bytebuffer на:
источник
Я не тестировал это, но вы можете попробовать использовать PipedInputStream и PipedOutputStream. Это может выглядеть примерно так:
источник
Вот что я сделал для загрузки фотографии с помощью почтового запроса.
ПРИМЕЧАНИЕ. Для этого кода требуются библиотеки, поэтому следуйте инструкциям. здесь , чтобы получить библиотеки.
источник
HttpClient
(ваша ссылка устарела. Используйте вместо нее эту ), которую ребята из Android оставляют только для обратной совместимости, а не используют встроеннуюHttpURLConnection
. С другой стороны, похоже, что для его настройки требуется больше работы, поэтому, возможно, это не стоит усилий.Я обнаружил, что использовать okHttp намного проще, так как я не мог заставить работать ни одно из этих решений: https://stackoverflow.com/a/37942387/447549
источник
Я попробовал приведенные выше решения, и ни одно из них не помогло мне из коробки.
тем не мение http://www.baeldung.com/httpclient-post-http-request . Строка 6 POST Multipart Request сработала за секунды
источник