Загрузить изображение на сервер, используя модернизацию - PullRequest
0 голосов
/ 25 апреля 2018

Я хочу загрузить изображение / файл на сервер, используя его URI, используя следующий код

try {

                    String descriptionString = "Sample description";
                    RequestBody description = RequestBody.create(MultipartBody.FORM, descriptionString);

                    File file = new File(path);

                    String extension = MimeTypeMap.getFileExtensionFromUrl(uri.toString());

                    if (extension != null) {

                        String type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
                        RequestBody requestFile = RequestBody.create(MediaType.parse(type), file);

                        MultipartBody.Part body2 = MultipartBody.Part.createFormData("avatar", file.getName(), new FileRequestBody(file, extension));

                        Response<ResponseBody> response = ApiCaller.getProfileAPI().requestingUploadProfilePhoto("Bearer " + AuthenticationProvider.getInstance().token.token,
                                "form-data; name=avatar; filename=\"" + file.getName() + "\"",
                                ProfileProvider.getInstance().parsedProfile.profileId,
                                description,
                                body2).execute();
                        if (response.isSuccessful()){
                            Logger.msg("Photo", ": uploaded successfully " + uri);
                        }else{
                            Logger.msg("Photo", ": uploaded successfully none" + uri + response.errorBody().string());
                        }
                    }else{
                        Logger.msg("Photo", ":extension error");
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }

Мой API-сервис для этого запроса

 @Multipart
@POST("v1/avatar/profiles/{profileId}/upload")
Call<ResponseBody> requestingUploadProfilePhoto(@Header("Authorization") String authHeader,
                                                @Header("Content-Disposition") String content_type,
                                                @Path("profileId") String profileId,
                                                @Part("description") RequestBody description,
                                                @Part MultipartBody.Part file);

Итак, мой ответ не был успешным,API возвращает мне статус ошибки Internal Server 500, но я знаю, что сервер работает хорошо (я тестировал это другое приложение).Кроме того, файл URI тоже хорошо.Я новичок здесь, так что кто-то может найти мою ошибку и подробно объяснить, почему это неправильно.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

если кто-то найдет это полезным, ошибка была в 1-м параметре «имя» здесь (в моем случае это должен быть «файл» в соответствии с сервером, а не «аватар»)

MultipartBody.Part body2 = MultipartBody.Part.createFormData("avatar", file.getName(), new FileRequestBody(file, extension));

Response<ResponseBody> response = ApiCaller.getProfileAPI().requestingUploadProfilePhoto("Bearer " + AuthenticationProvider.getInstance().token.token,
                            ProfileProvider.getInstance().parsedProfile.profileId,
                            body2).execute();
                    if (response.isSuccessful()){
                        Logger.msg("Photo", ": uploaded successfully " + uri);
                    }else{
                        Logger.msg("Photo", ": uploaded successfully none" + uri + response.errorBody().string());
                    }

Итак, этоДостаточно было поменять его и удалить все ненужные вещи.Также, конечно, необходимо изменить служебный файл, согласно параметрам.Я не обратил на это должного внимания, потому что в уроках он не упоминался как важный параметр.

0 голосов
/ 25 апреля 2018

Вы можете использовать преобразование вашего изображения в файл и создать многочастный запрос, как показано ниже

    String fileName = "myFile";
    RequestBody reqFile = RequestBody.create(MediaType.parse("image/*"), file);
    MultipartBody.Part body = MultipartBody.Part.createFormData("image", fileName, reqFile);

Чтобы преобразовать ваше изображение в файл, используйте следующую функцию

    public static File convertBitmapToFile(Context mContext, Bitmap bitmap) {
        try {
            File f = new File(mContext.getCacheDir(), "image");
            f.createNewFile();

            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.JPEG, 60 /*ignored for PNG*/, bos);
            byte[] bitmapdata = bos.toByteArray();


            FileOutputStream fos = new FileOutputStream(f);
            fos.write(bitmapdata);
            fos.flush();
            fos.close();
            return compressImageFile(mContext, f);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

Retrofit Api Definition

    @Multipart
    @POST("/upload/image")
    Call<ResponseBody> uploadImage(@Part MultipartBody.Part image);

Для функции компрессора используйте следующий код

Добавьте это в gradle

compile 'id.zelory:compressor:2.1.0'



public static File compressImageFile(Context mContext, File file) {
        try {
            return new Compressor(mContext).compressToFile(file);
        } catch (IOException e) {
            e.printStackTrace();
            return file;
        }
    }
...