VariusRain
@VariusRain
музыкант-программист-конструктор

Как правильно отправлять файлы средствами HttpUrlConnection?

Всем доброго времени суток!

Очень мало толковой информации смог найти в сети, надеюсь мне кто-то что-то сможет разъяснить.
И так, есть мобильное приложение, с него нужно отправить файл на сервер, на котором его будет принимать php.
На стороне php проблем нет, а вот со стороны клиента плохо понимаю, откуда растут ноги.

Из тех обрывков информации и примеров кода смог собрать и привести в порядок следующую функцию
static String SendFilePOST(String address, String data, String FilePath) {
        String result = "";
        try {
            int bytesRead, bytesAvailable, bufferSize;
            byte[] buffer;
            int maxBufferSize = 1*1024*1024;

            File file = new File(FilePath);
            URL url = new URL(address);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
           //Вот до сюда всё логично
            String boundary = UUID.randomUUID().toString();
           // Что такое boundary и зачем оно нужно? Я понимаю, что это граница, но граница чего? Данных?
            //нужно ли мне это как-то особенным образом обрабатывать на стороне php?
            conn.setRequestMethod("POST");
            conn.setDoOutput(true);
            conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);

            DataOutputStream request = new DataOutputStream(conn.getOutputStream());
//если boundary - это граница, то зачем мне тут ещё "--"?
            request.writeBytes("--" + boundary + "\r\n");
            request.writeBytes("Content-Disposition: form-data; name=\"description\"\r\n\r\n");
            request.writeBytes("Какое-то описание фала\r\n");
            //на сколько я могу судить, здесь я задаю значение переменной description
            //которую смогу прочитать в $_POST['description']
            //Если я понимаю правильно, тогда зачем два переноса строк?
            //и почему дальше я объявляю переменную file, но сразу на ней идёт filename
            //а содержимое файла от его имени отделено только переносами строк?
            request.writeBytes("--" + boundary + "\r\n");
            request.writeBytes("Content-Disposition: form-data; name=\"file\"; filename=\"" + file.getName() + "\"\r\n\r\n");

            //добавление файла
            FileInputStream fileInputStream = new FileInputStream(file);

            bytesAvailable = fileInputStream.available();
            bufferSize = Math.min(bytesAvailable, maxBufferSize);
            buffer = new byte[bufferSize];

            // Read file
            bytesRead = fileInputStream.read(buffer, 0, bufferSize);

            while (bytesRead > 0) {
                request.write(buffer, 0, bufferSize);
                bytesAvailable = fileInputStream.available();
                bufferSize = Math.min(bytesAvailable, maxBufferSize);
                bytesRead = fileInputStream.read(buffer, 0, bufferSize);
            }
            //конец добавления файла

            request.writeBytes("\r\n");

            request.writeBytes("--" + boundary + "--\r\n");
            request.flush();
            int respCode = conn.getResponseCode();

            switch(respCode) {
                case 200:
                    result = "ok";
                    break;
                case 301:
                case 302:
                case 307:
                    //handle redirect - for example, re-post to the new location
                    break;
                default:
                    //do something sensible
            }

        } catch (Exception e) {
            return e.getMessage();
        }
        return result;
    }


Все основные вопросы написал в комментариях к коду, но также есть вопрос и по получению текстового ответа от сервера, так как php по итогу принятия файла отвечает строкой в json формате.

Возможно, я выбрал не самый простой путь и можно сделать это как-то иначе, буду чрезмерно благодарен за подсказку.
  • Вопрос задан
  • 869 просмотров
Решения вопроса 1
@UserTwo
Я конечно не профессионал, но я бы советовал вам использовать для таких целей и вообщем для http запросов одну из популярных библиотек, например OkHttp https://square.github.io/okhttp/
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы