Отправить JSON и изображение с помощью HttpURLConnection в Android

я пытаюсь отправить некоторые данные на сервер. Сервер ждет json и изображение. Я пробовал с каждым примером, который я нашел, но я не мог отправить данные. На самом деле я отправляю параметры json с объектом PrintWriter, но он не принимает изображение. Мне нужно использовать HttpURLConnection не с библиотекой Apache. Это мой кусок кода работает:

HttpURLConnection connection = null;
    PrintWriter output = null;

    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    attachImage.compress(Bitmap.CompressFormat.PNG, 40, stream);
    byte[] imageData = stream.toByteArray();
    String imagebase64 = Base64.encodeToString(imageData, Base64.DEFAULT); 

    Log.d(tag, "POST to " + url);
    try{
        URL url = new URL(this.url);
        connection = (HttpURLConnection) url.openConnection();

        connection.setRequestMethod("POST");

        connection.setDoInput(true);
        connection.setDoOutput(true);
        connection.setUseCaches(false);

        connection.setRequestProperty(HTTP_CONTENT_TYPE, "application/json; charset=utf-8");
        connection.setRequestProperty(HTTP_USER_AGENT, mUserAgent);
        connection.setRequestProperty(HTTP_HEADER_ACCEPT, "application/json; charset=utf-8");
        connection.connect();
        output = new PrintWriter(connection.getOutputStream());

        JSONObject jsonParam = new JSONObject();
        jsonParam.put("oauth_token", params.get("oauth_token"));
        jsonParam.put("rating", "1");
        jsonParam.put("comments", "ASDASDASDASDASDASDAS");


        Log.d(tag, jsonParam.toString());

        output.print(jsonParam);
        output.flush();
        output.close();

        Log.d(tag, connection.getResponseCode() + connection.getResponseMessage());
    }catch(Exception e ){

    }

Когда я пытаюсь отправить изображение в параметрах json, я получаю сообщение о внутренней ошибке 500.

Спасибо!


person Augusto Pinto    schedule 05.05.2015    source источник
comment
Ошибка HTTP 500 означает ошибку на стороне сервера...   -  person shkschneider    schedule 05.05.2015
comment
Очевидно, что здесь может быть полезен журнал ошибок сервера.   -  person class stacker    schedule 05.05.2015
comment
en.wikipedia.org/wiki/List_of_HTTP_status_codes#500   -  person dieter    schedule 05.05.2015
comment
Да, я знаю, что это значит. но может ли это быть из-за того, что я отправляю неправильные параметры? Если я не отправлю изображение, как в приведенном выше примере, оно работает нормально   -  person Augusto Pinto    schedule 05.05.2015
comment
Коды ошибок 4xx здесь для этого ... Ваш сервер возвращает 500, что означает, что у него есть ошибка. Сначала исправьте это ИМХО.   -  person shkschneider    schedule 05.05.2015
comment
Хорошо, но мне все еще нужно загрузить изображение на сервер, но я не знаю, как это сделать. Я пробовал с большим количеством примеров, но ничего не работает для меня. Любая помощь или пример? Спасибо!   -  person Augusto Pinto    schedule 05.05.2015
comment
The server is waiting a json and an image. . Ok. Затем начните говорить, как сервер хочет, чтобы они были отправлены. Это ваш собственный сервер? Php? Пожалуйста, загрузите используемый скрипт.   -  person greenapps    schedule 05.05.2015
comment
When I try to send an image in json params,. Пожалуйста, добавьте код, который вы пробовали.   -  person greenapps    schedule 05.05.2015
comment
Нет, это не мой сервер. Я не могу получить к нему доступ.   -  person Augusto Pinto    schedule 06.05.2015


Ответы (4)


Хорошо, по моему предложению 2 способа отправить изображение на сервер

  1. использовать строку base 64
  2. Прямая загрузка на сервер

1. для базы 64 перейдите по ссылке ниже

Android отправляет строку Base64 в PHP

2. для прямой загрузки на сервер, пожалуйста, проверьте ссылку ниже

http://www.androidhive.info/2014/12/android-uploading-camera-image-video-to-server-with-progress-bar/

Удачного кодирования !!

person Madhav Anadkat    schedule 05.05.2015
comment
Я пробовал с первым вариантом, но не работает. теперь я давайте попробуем со вторым. Спасибо. - person Augusto Pinto; 05.05.2015
comment
Согласно второму варианту вам нужно разместить службу на локальном хосте или в реальном времени, и тогда вы сможете это сделать! - person Madhav Anadkat; 05.05.2015
comment
Я не хочу использовать MultipartEntity - person Augusto Pinto; 06.05.2015
comment
Затем перейдите к преобразованию строки base 64 и отправьте эту строку на свой сервер! - person Madhav Anadkat; 06.05.2015
comment
Может вы что-то упускаете!! пожалуйста, проверьте ссылку ниже, я сделал то же самое !! stackoverflow.com/questions/9987343 / - person Madhav Anadkat; 07.05.2015

Люди! После долгого дня я смог загрузить изображение на сервер! Я читал эту библиотеку, которая предназначена для многих целей. https://source.android.com/reference/com/android/tradefed/util/net/HttpMultipartPost.html Я скачал исходный код и сделал несколько шагов, чтобы отправить изображение. Я отправляю только байты, которые были закодированы из ASCII. Спасибо за помощь!

person Augusto Pinto    schedule 15.05.2015
comment
Я тоже пытаюсь отправить данные на сервер. До сих пор я использовал устаревшие учебники, и ничего не работает. Я даже не могу отправить NameValuePair на сервер. Метод setEntity почему-то не работает. Не могли бы вы помочь мне в создании метода отправки на сервер, который также мог бы отправлять текст и изображения? - person Bogdan Daniel; 15.05.2015
comment
Вы ссылку выше смотрели? Я использовал несколько классов из библиотеки tradefed и адаптировал их для работы с моим кодом. Другое решение - использовать библиотеку apache, которую я не рекомендую. Кроме того, вы должны прочитать эту ссылку, чтобы понять, как работает httpURLConnection. 17od.com/2010/02/18/multipart -form-upload-on-android - person Augusto Pinto; 18.05.2015

Проверьте этот код ниже, чтобы отправить данные формы и zip-файл, содержащий изображения или другие мультимедийные файлы.

private class MultipartFormTask extends AsyncTask<String, Void, String> {

        String getStringFromInputStream(HttpURLConnection conn) {
            String strResponse = "";
            try {
                DataInputStream inStream = new DataInputStream(
                        conn.getInputStream());

                BufferedReader br = new BufferedReader(new InputStreamReader(
                        inStream));
                String line;
                while ((line = br.readLine()) != null) {
                    strResponse += line;
                }
                br.close();
                inStream.close();
            } catch (IOException ioex) {
                Log.e("Debug", "error: " + ioex.getMessage(), ioex);
            }
            return strResponse;
        }

        void uploadJSONFeed(HttpURLConnection conn, DataOutputStream dos,
                String lineEnd) {
            String issue_details_key = "issue_details";
            String issue_details_value = "Place your Jsondata HERE";
            try {
                dos.writeBytes("Content-Disposition: form-data; name=\""
                        + issue_details_key + "\"" + lineEnd
                        + "Content-Type: application/json" + lineEnd);
                dos.writeBytes(lineEnd);
                dos.writeBytes(issue_details_value);
                dos.writeBytes(lineEnd);
            } catch (IOException ioe) {
                Log.e("Debug", "error: " + ioe.getMessage(), ioe);
            }

        }

        void uploadZipFile(HttpURLConnection conn, DataOutputStream dos,
                String lineEnd) {
            int bytesRead, bytesAvailable, bufferSize;
            byte[] buffer;
            int maxBufferSize = 1 * 1024 * 1024;
            try {

                InputStream is = null;
                try {
                    is = getAssets().open("Test.zip");
                } catch (IOException ioe) {
                    // TODO Auto-generated catch block
                    Log.e("Debug", "error: " + ioe.getMessage(), ioe);
                }

                String zip_file_name_key = "file_zip";
                String upload_file_name = "test.zip";

                dos.writeBytes("Content-Disposition: form-data; name=\""
                        + zip_file_name_key + "\";filename=\""
                        + upload_file_name + "\"" + lineEnd); // uploaded_file_name
                                                                // is the Name
                                                                // of the File
                                                                // to be
                                                                // uploaded
                dos.writeBytes(lineEnd);
                bytesAvailable = is.available();
                bufferSize = Math.min(bytesAvailable, maxBufferSize);
                buffer = new byte[bufferSize];
                bytesRead = is.read(buffer, 0, bufferSize);
                while (bytesRead > 0) {
                    dos.write(buffer, 0, bufferSize);
                    bytesAvailable = is.available();
                    bufferSize = Math.min(bytesAvailable, maxBufferSize);
                    bytesRead = is.read(buffer, 0, bufferSize);
                }
                dos.writeBytes(lineEnd);

                is.close();
            } catch (IOException ioe) {
                Log.e("Debug", "error: " + ioe.getMessage(), ioe);
            }
        }

        @Override
        protected String doInBackground(String... params) {
            // TODO Auto-generated method stub

            HttpURLConnection conn = null;
            DataOutputStream dos = null;
            String lineEnd = "\r\n";
            String twoHyphens = "--";
            String boundary = "*****";

            String urlString = "http://www.example.org/api/file.php";
            try {
                // ------------------ CLIENT REQUEST

                // FileInputStream fileInputStream = new FileInputStream(new
                // File(existingFileName) );
                // open a URL connection to the Servlet
                URL url = new URL(urlString);
                // Open a HTTP connection to the URL
                conn = (HttpURLConnection) url.openConnection();
                // Allow Inputs
                conn.setDoInput(true);
                // Allow Outputs
                conn.setDoOutput(true);
                // Don't use a cached copy.
                conn.setUseCaches(false);
                // Use a post method.
                conn.setRequestMethod("POST");
                conn.setRequestProperty("Connection", "Keep-Alive");
                conn.setRequestProperty("Content-Type",
                        "multipart/form-data;boundary=" + boundary);
                dos = new DataOutputStream(conn.getOutputStream());

                dos.writeBytes(twoHyphens + boundary + lineEnd);
                uploadJSONFeed(conn, dos, lineEnd);

                dos.writeBytes(twoHyphens + boundary + lineEnd);
                uploadZipFile(conn, dos, lineEnd);

                dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
                dos.flush();
                dos.close();
            } catch (MalformedURLException ex) {
                Log.e("Debug", "error: " + ex.getMessage(), ex);
            } catch (IOException ioe) {
                Log.e("Debug", "error: " + ioe.getMessage(), ioe);
            }
            // ------------------ read the SERVER RESPONSE
            String strResponse = getStringFromInputStream(conn);

            return strResponse;
        }

        @Override
        protected void onPostExecute(String result) {
            // might want to change "executed" for the returned string passed
            // into onPostExecute() but that is upto you

            Toast.makeText(getApplicationContext(), result, Toast.LENGTH_LONG)
                    .show();
            Log.e("Result:", result);
        }
    }
person Kirankumar Zinzuvadia    schedule 05.05.2015

Код ошибки HTTP 500 означает, что произошла ошибка на стороне сервера.

Это не имеет ничего общего с вашим кодом.

Ошибка на сервере, а не в вашем коде.

person shkschneider    schedule 05.05.2015
comment
... вы предполагаете, что сервер не может столкнуться с ошибкой из-за ошибки в клиенте? Интересно. - person class stacker; 05.05.2015
comment
Возможно, но вопрос, заданный здесь, подразумевает, что открытый код содержит ошибку, которая, в случае 500, находится на стороне сервера, а не на стороне клиента. Сервер просто НЕ должен отправлять код ошибки 500 из-за неверных входных данных или чего-то еще. Для этого существуют другие коды 4xx. - person shkschneider; 05.05.2015
comment
Я пробовал с этим примером stackoverflow.com/questions/26686806/ Но это не сработало. - person Augusto Pinto; 05.05.2015
comment
Это вздор. Вы также должны прочитать, что сервер отвечает/отправляет в ответ. Чтение из InputStream. Вы еще этого не делаете. Добавьте это. Код был опубликован сто раз. - person greenapps; 05.05.2015