Android отправлять изображение на php сервер всегда терпит неудачу - PullRequest
0 голосов
/ 05 августа 2020

Спасибо всем, кто мне помог.

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

Надеюсь может помочь другим нуждающимся.

static String postUploadImageToPHPServer(String URL, String no, String key, String imgPath) {
        String multipart_form_data = "multipart/form-data";
        String twoHyphens = "--";
        String boundary = "**********uploadimage**********";
        String lineEnd = System.getProperty("line.separator");

        try {
            URL url = new URL(URL);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setConnectTimeout(120000);
            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.setUseCaches(false);
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Connection", "Keep-Alive");
            conn.setRequestProperty("Content-Type", multipart_form_data + "; boundary=" + boundary);
            conn.connect();

            DataOutputStream output = new DataOutputStream(conn.getOutputStream());

            addImageContent(imgPath, output);
            addNoFormField(no, output);
            addKeyFormField(key, output);

            output.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
            output.flush();

            BufferedReader input = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            StringBuilder response = new StringBuilder();
            String oneLine;
            while((oneLine = input.readLine()) != null) {
                response.append(oneLine + lineEnd);
            }

            return response.toString();
        } catch (Exception e) {
            Log.e(TAG, "Error: " + e.getMessage());
            return null;
        }
    }

Вот метод, как добавить данные изображения.

private static void addImageContent(String _path, DataOutputStream _output) {
        StringBuilder split = new StringBuilder();
        split.append(twoHyphens + boundary + lineEnd);
        split.append("Content-Disposition: form-data; name=\"" + "img" + "\"; filename=\"" + _path + "\"" + lineEnd);
        split.append("Content-Type: " + "image/jpeg" + lineEnd);
        split.append(lineEnd);
        try {
            Bitmap bitmap = BitmapFactory.decodeFile(_path);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.JPEG, 80, baos);
            byte[] imageBytes = baos.toByteArray();

            _output.writeBytes(split.toString());
            _output.write(imageBytes);
            _output.writeBytes(lineEnd);

            baos.close();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

Здесь метод как добавить текстовые данные, моя addNoFormField функция похожа на addKeyFormField функция, просто измените name=\"your param\"".

private static void addNoFormField(String _value, DataOutputStream _output) {
        StringBuilder sb = new StringBuilder();
        sb.append(twoHyphens + boundary + lineEnd);
        sb.append("Content-Disposition: form-data; name=\"no\"" + lineEnd);
        sb.append("Content-Type: application/json; charset=utf-8" + lineEnd);
        sb.append(lineEnd);
        sb.append(_value + lineEnd);
        try {
            _output.writeBytes(sb.toString());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

Ответы [ 2 ]

0 голосов
/ 05 августа 2020

У меня была такая же проблема при отправке изображения в виде строки, попробуйте отправить его как файл через Multipart, попробуйте использовать эту функцию, когда вы делаете запрос изображения как postWebserviceCallForImage()

public String makeImageRequest(String url, String method,
                                    String image,List<NameValuePair> nameValuePairs) {
//url to post the image,method 'post',image absolute path on the phone,'is' is inputstream 
        
        try {
            json="";


     
            MultipartEntityBuilder builder = MultipartEntityBuilder.create();

  
            builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
            FileBody fbd=new FileBody(new File(image));
            builder.addPart("my_file",fbd);

//if you want to add string



for (int index = 0; index < nameValuePairs.size(); index++) {


                builder.addPart(nameValuePairs.get(index).getName(),new StringBody(nameValuePairs.get(index).getValue(),ContentType.TEXT_PLAIN));

            }


          


            HttpParams httpParameters = new BasicHttpParams();
            int timeoutConnection = 10000;
            HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);

            int timeoutSocket = 12000;
            HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);

            DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
            HttpPost httpPost = new HttpPost(url);

            HttpEntity entity = builder.build();

            httpPost.setEntity(entity);

            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            json = sb.toString();
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }



        return json;

    }

В вашей асинхронной задаче вызовите эту функцию, и я надеюсь, что она сработает, а также не забудьте добавить эту зависимость в свой gradle, если она отсутствует:

implementation group: 'org.apache.httpcomponents', name: 'httpmime', version: '4.3.1'
0 голосов
/ 05 августа 2020

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

Даже загрузка изображения также не выполняется, проверьте следующее: http://codesfor.in/how-to-upload-image-to-server-as-base64-encoded-string/comment-page-1/

Делаем это JSON способом, Отправка изображения в кодировке base64 на сервер с помощью HttpUrlConnection Android

...