Публикация и использование изображений с помощью Okhttp для Django Rest Frame Back end - PullRequest
1 голос
/ 06 июля 2019

У меня есть серверная часть, которую я могу загрузить в него по следующему запросу в Pyhton :

data = {
    "prop_post": 35
}
headers = {
    # "Content-Type": "application/json",
    "Authorization": "JWT " + t1,
}
if img_path is not None:
    with open(img_path, 'rb') as image:
        file_data = {
            'photo': image
        }
        r = requests.post(POSTS_ENDPOINT, data=data,files=file_data, headers=headers)

это моя среда разработки. Сейчас в производстве я собираюсь использовать Android в качестве клиента для загрузки изображения. Я использую Okhttp3. Вот код, который я использую для загрузки изображения:

final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/jpg");
                            String file2 = utils.getRealPathFromURI2(obj.getPhotos_uri()[0], context);
                            File file = new File(file2);
                            RequestBody req = new MultipartBody.Builder()
                                    .setType(MultipartBody.FORM)
                                    .addFormDataPart("prop-post", Integer.toString(id))
                                    .addFormDataPart("photo", "IMG-20190705-WA0002.jpg",
//                                            RequestBody.create(MEDIA_TYPE_PNG, file.getAbsolutePath())).build();
                                            RequestBody.create(MEDIA_TYPE_PNG, file)).build();

                            Request request = new Request.Builder()
                                    .url(root + "images/")
                                    .addHeader("Authorization", header)
                                    .post(req)
                                    .build();

                            OkHttpClient client = new OkHttpClient();
                            Response response2 = client.newCall(request).execute();

Этот запрос не выполняется с ответом 400 (Плохой запрос). Абсолютное местоположение моего файла в Android: / хранилище / эмуляция / 0 / WhatsApp / Media / WhatsApp Images / IMG-20190705-WA0002.jpg

Я ценю, если кто-нибудь скажет мне, что я делаю неправильно. Заранее спасибо

1 Ответ

1 голос
/ 07 июля 2019

Я закончил с использованием модернизации: добавил эти зависимости в gradle:

implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'

затем определил следующий интерфейс:

public interface ImageAPI {
    @Multipart
    @POST("images/")
    Call<ResponseBody> createPost( @Part MultipartBody.Part file, @Part("prop_post") RequestBody requestBody);
}

тогда мой почтовый звонок выглядит так:

OkHttpClient.Builder okHttpClientBuilder = new OkHttpClient.Builder();
        okHttpClientBuilder
                .addInterceptor(new Interceptor() {
                    @Override
                    public okhttp3.Response intercept(Chain chain) throws IOException {
                        Request request = chain.request();
                        Request.Builder newRequest = request.newBuilder().header("Authorization", "mytoken");
                        return chain.proceed(newRequest.build());
                    }
                });
        Gson gson = new GsonBuilder()
                .setLenient()
                .create();
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(rootUrl)
                .client(okHttpClientBuilder.build())
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();


        ImageAPI imageAPI = retrofit.create(ImageAPI.class);


        String image_path = imagepath;//sets when browsing image
        File file = new File(image_path);

        RequestBody fileReqBody = RequestBody.create(MediaType.parse("image/*"), file);
        MultipartBody.Part part = MultipartBody.Part.createFormData("photo", file.getName(), fileReqBody);


        RequestBody id= RequestBody.create(MediaType.parse("text/plain"), "68");



        Call<ResponseBody> call = imageAPI.createPost(part, id);
        try {
            call.enqueue(new Callback<ResponseBody>() {
                @Override
                public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                    Log.d("tag", "onResponse: " + response.message().toString());
                }

                @Override
                public void onFailure(Call<ResponseBody> call, Throwable t) {
                    Log.d("tag", "onResponse: " + t.getMessage());

                }
            });
        } catch (Exception e) {
            Log.d("tag", "onCreate: " + e.getMessage());
        }
...