Я использую эту функцию в приложении для отправки изображения на сервер с помощью OkHttp3 в multipart / form-data - PullRequest
0 голосов
/ 02 июня 2018
void postRequest() throws IOException {

    OkHttpClient client = new OkHttpClient();

    File file = new File(Environment.getExternalStorageDirectory().toString() + "/Image_ref.jpg");

    RequestBody requestbody = RequestBody.create(MultipartBody.FORM, file);

    Request request = new Request.Builder().
            addHeader("Authorization", "test").
            post(requestbody).
            url("MY_API").
            build();

    client.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            call.cancel();
        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            Log.d("TAG",response.body().string());
        }
    });
}

, но я получаю ответ:

"Содержимое запроса было искажено: у Content-Type с составным типом мультимедиа должен быть параметр 'border'.

Пожалуйста, дайте мне знать, если я делаю что-то не так и что такое параметр 'border' и как его установить?

1 Ответ

0 голосов
/ 02 июня 2018
RequestBody requestbody = RequestBody.create(MultipartBody.FORM, file);

Я бы предложил попробовать использовать, я использую то же самое для отправки изображений, и я отправляю несколько изображений в одном запросе, используя метод ниже

MultipartBody.Builder multipartBodyBuilder = new MultipartBody.Builder();
        multipartBodyBuilder.setType(MultipartBody.FORM); //this may not be needed 
multipartBodyBuilder.addFormDataPart("file", "Image_ref.jpg", RequestBody.create(MEDIA_TYPE, file) );

тот же запрос затем может быть использован для этого *Строка переменной 1005 *

 try {
                                          Response response = oKclient.newCall(request).execute();

                                          line = response.body().string();

                                      }catch
                                              (Exception e ){
                                          e.printStackTrace();

                                      }

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

String order_data = "asdsd";
        String images = getImages(id); //my funciton returns a json array Stringified
        net.minidev.json.JSONArray fileArray = (net.minidev.json.JSONArray) net.minidev.json.JSONValue.parse(images);

        MultipartBody.Builder multipartBodyBuilder = new MultipartBody.Builder();
        multipartBodyBuilder.            setType(MultipartBody.FORM);
        multipartBodyBuilder.addFormDataPart("email", basicFunction.getUsername());
        multipartBodyBuilder.addFormDataPart("password", basicFunction.getPassword());

        multipartBodyBuilder.addFormDataPart("order_data",order_data);
        int filer = 0; // adding a php based filter this can be the php array counter
        MediaType MEDIA_TYPE = MediaType.parse("image/png" ); //
        for (Iterator<Object> flavoursIter = fileArray.iterator(); flavoursIter.hasNext();){
            net.minidev.json.JSONObject temp = (net.minidev.json.JSONObject) flavoursIter.next();
            String path = (String)temp.get("path");
            if(path.isEmpty() || path ==null ) continue;
            path = path.substring(6);
            // path = "fila://"+path;
            File file = new File(path);
            multipartBodyBuilder.addFormDataPart("file", "img.png", RequestBody.create(MEDIA_TYPE, file) );

// если появляется только один файл, вы можете использовать этот код

// multipartBodyBuilder.addFormDataPart ("file [" + filer ++ "] "," img.png ", RequestBody.create (MEDIA_TYPE, file));

        }


        MultipartBody multipartBody = multipartBodyBuilder.build();



        Request request = new Request.Builder()
                .url("Url_to_use")
                .post(multipartBody)
                .build();
...