Ошибка POST запроса с типом содержимого multipart/form-data

181
07 декабря 2017, 00:28

Возникла проблема по передаче изображения на сервер. Данный код написан для Android и работает только с версией 4.1 и ниже. При использовании в других версиях ловит ProtocolException.
Разрешение на доступ к файлам есть.

public class FilesUploadingTask extends AsyncTask<Void, Void, String> {
    private ProgressDialog WaitingDialog;
    private String lineEnd = "\r\n";
    private String twoHyphens = "--";
    private String boundary =  "Asrf456BGe4h";
    // Переменные для считывания файла в оперативную память
    private int bytesRead, bytesAvailable, bufferSize;
    private byte[] buffer;
    private int maxBufferSize = 1*1024*1024;
    private String filePath, fullSize;
    // Адрес метода api для загрузки файла на сервер
    public static final String API_FILES_UPLOADING_PATH = "адрес пути отправки запроса";
    // Ключ, под которым файл передается на сервер
    public static final String FORM_FILE_NAME = "file";
    @Override
    protected void onPreExecute() {
        WaitingDialog = ProgressDialog.show(context, "Отправка данных",
                "Отправляем изображение... \n Это может занять продолжительное время", true);
        super.onPreExecute();
    }
    public FilesUploadingTask(String filePath, String fullSize) {
        this.filePath = filePath;
        this.fullSize = fullSize;
    }
    @Override
    protected String doInBackground(Void... params) {
        // Результат выполнения запроса, полученный от сервера
        String result = "null";
        try {
            // Создание ссылки для отправки файла
            URL uploadUrl = new URL(API_FILES_UPLOADING_PATH);
            // Создание соединения для отправки файла
            HttpURLConnection conn = (HttpURLConnection) uploadUrl.openConnection();
            conn.setDoOutput(true);
            conn.setUseCaches(false);
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Host", "www.spamu.net");
            conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary);
            conn.setRequestProperty("Content-Length", "" + fullSize);
            DataOutputStream outputStream = new DataOutputStream(conn.getOutputStream());
            // Начало контента
            outputStream.writeBytes(twoHyphens + boundary + lineEnd);
            outputStream.writeBytes("Content-Disposition: form-data; name=\"name\"" + lineEnd);
            outputStream.writeBytes(lineEnd);
            outputStream.writeBytes(sName + lineEnd);
            outputStream.writeBytes(twoHyphens + boundary + lineEnd);
            outputStream.writeBytes("Content-Disposition: form-data; name=\"contact\"" + lineEnd);
            outputStream.writeBytes(lineEnd);
            outputStream.writeBytes(sPhone + lineEnd);
            // Формирование multipart контента
            outputStream.writeBytes(twoHyphens + boundary + lineEnd);
            // Заголовок элемента формы
            outputStream.writeBytes("Content-Disposition: form-data; name=\"" +
                    FORM_FILE_NAME + "\"; filename=\"" + filePath + "\"" + lineEnd);
            // Тип данных элемента формы
            outputStream.writeBytes("Content-Type: image/jpeg" + lineEnd);
            // Конец заголовка
            outputStream.writeBytes(lineEnd);
            // Поток для считывания файла в оперативную память
            FileInputStream fileInputStream = new FileInputStream(new File(filePath));
            bytesAvailable = fileInputStream.available();
            bufferSize = Math.min(bytesAvailable, maxBufferSize);
            buffer = new byte[bufferSize];
            // Считывание файла в оперативную память и запись его в соединение
            bytesRead = fileInputStream.read(buffer, 0, bufferSize);
            while (bytesRead > 0) {
                outputStream.write(buffer, 0, bufferSize);
                bytesAvailable = fileInputStream.available();
                bufferSize = Math.min(bytesAvailable, maxBufferSize);
                bytesRead = fileInputStream.read(buffer, 0, bufferSize);
            }
            // Конец элемента формы
            outputStream.writeBytes(lineEnd);
            outputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
            int serverResponseCode = conn.getResponseCode();
            fileInputStream.close();
            outputStream.flush();
            outputStream.close();
            if(serverResponseCode == 200) {
                result = readStream(conn.getInputStream());
            } else {
                result = readStream(conn.getErrorStream());
            }
            //Log.d("classInJson", "result > " + result);
            return result;
        } catch (MalformedURLException e) {
            Log.d("classInJson", "Ошибка соединения с сервером > " + result);
            WaitingDialog.dismiss();
            e.printStackTrace();
            return "MailformedURLe";
        } catch (ProtocolException e) {
            Log.d("classInJson", "Несовпадение протоколов передачи данных > " + result);
            WaitingDialog.dismiss();
            e.printStackTrace();
            return "Protocole";
        } catch (FileNotFoundException e) {
            Log.d("classInJson", "Файл не найден > " + result);
            WaitingDialog.dismiss();
            e.printStackTrace();
            return "NoFilee";
        } catch (IOException e) {
            Log.d("classInJson", "Ошибка передачи данных > " + result);
            WaitingDialog.dismiss();
            e.printStackTrace();
            return "IOe";
        }
    }
    public String readStream(InputStream inputStream) throws IOException {
        StringBuffer buffer = new StringBuffer();
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        String line;
        while ((line = reader.readLine()) != null) {
            buffer.append(line);
        }
        return buffer.toString();
    }
    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        JSONObject dataJsonObj = null;
        switch (result) {
            case"MailformedURLe":
                Toast.makeText(context, "Ошибка соединения с сервером", Toast.LENGTH_LONG).show();
                break;
            case "Protocole":
                Toast.makeText(context, "Несовпадение протоколов передачи данных", Toast.LENGTH_LONG).show();
                break;
            case "NoFilee":
                Toast.makeText(context, "Файл для передачи не найден", Toast.LENGTH_LONG).show();
                break;
            case "IOe":
                Toast.makeText(context, "Ошибка передачи", Toast.LENGTH_LONG).show();
                break;
        }
        try {
            dataJsonObj = new JSONObject(result);
            JSONObject resultdata = dataJsonObj.getJSONObject("data");
        } catch (JSONException e) {
            e.printStackTrace();
        }
        WaitingDialog.dismiss();
    }
}
READ ALSO
Perhaps you are running on a JRE rather than a JDK? Ошибка компиляции maven проекта

Perhaps you are running on a JRE rather than a JDK? Ошибка компиляции maven проекта

Доброго времени сутокПишу автотест, компилил его нормально через команду mvn test, но через время в командной строке стала появлятся ошибка...

157
Java: запись данных с консоли в файл

Java: запись данных с консоли в файл

При записи данных с консоли в файл сбивается кодировка

249
Java. Замена по регулярному выражению

Java. Замена по регулярному выражению

Есть несколько паттернов, которые я объединяю через join("|")

321
Алгоритм формирования списка

Алгоритм формирования списка

мне нужно придумать алгоритм, который будет формировать плейлист из треков длительностью 1 частреки находятся в 2 разных папках

215