Изпратете 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, което означава, че има грешка. Първо оправете това IMHO.   -  person shkschneider    schedule 05.05.2015
comment
Добре, но все още трябва да кача изображение на сървъра, но не знам как. Опитах с много примери, но нищо не работи за мен. Някаква помощ или пример? Благодаря!   -  person Augusto Pinto    schedule 05.05.2015
comment
The server is waiting a json and an image. . Добре. След това започнете да казвате как сървърът иска да бъдат изпратени. Ваш собствен сървър ли е? 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. използвайте базов низ 64
  2. Директно качване на сървър

1.за база 64 отидете на връзката по-долу

Android публикува Base64 String към 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
Според втората опция трябва да хоствате услугата на localhost или на живо и тогава можете да направите това! - person Madhav Anadkat; 05.05.2015
comment
Не искам да използвам MultipartEntity - person Augusto Pinto; 06.05.2015
comment
След това отидете на базово 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