Отправить файл изображения через Retrofit из Android в Spring - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь загрузить изображение через Retrofit в S3 через Spring. Итак, это в основном 2 задачи.

  1. Передача изображения в Spring API
  2. Из Spring API загрузите его на сервер S3.

Я знаю, как загрузить изображение на S3, и оно отлично работает.

Моя проблема - первая часть. Я перепробовал много решений в сети, но не сработал. Вот мой код ->

На стороне Android, сначала я получаю файл и загружаю его в Spring API ->

private void UploadFiles() {
        File uploadFile = fileArrayList.get(0);
        if (uploadFile != null) {
            Log.d(TAG, "UploadFiles: File Name is -> " + uploadFile.getName());
            RequestBody requestFile = RequestBody.create(MediaType.parse("image/*"), uploadFile);
            MultipartBody.Part multipartBody = MultipartBody.Part.createFormData("image", uploadFile.getName(), requestFile);
            cropImageRequest.setCropId(uploadFile.getParent());
            cropImageRequest.setCropImage(multipartBody);
            FarmerResponse farmerResponse = UserAuth.getInstance(this).getCurrentUser();
            Api.uploadCropImage(farmerResponse.getAuthToken(), farmerResponse.getFarmer().getId(), cropImageRequest, new Callback<BasicResponse>() {
                @Override
                public void onResponse(Call<BasicResponse> call, Response<BasicResponse> response) {
                    Log.d(TAG, "onResponse: Success : " + response.toString());
                }

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

Я создал cropImageRequest.java, который по сути является классом POJO для тела запроса. Вот мой класс POJO, он содержит Image и ImageId. ->

import okhttp3.MultipartBody;

public class CropImageRequest {

    private String CropId;
    private MultipartBody.Part CropImage;

    public CropImageRequest() {

    }

    public void setCropId(String cropId) {
        CropId = cropId;
    }

    public void setCropImage(MultipartBody.Part cropImage) {
        CropImage = cropImage;
    }

    public CropImageRequest(String cropId, MultipartBody.Part cropImage) {
        CropId = cropId;
        CropImage = cropImage;
    }

    public String getCropId() {
        return CropId;
    }

    public MultipartBody.Part getCropImage() {
        return CropImage;
    }
}

Это мое объявление API внутри класса API. ->

public interface UploadCropImageApi {
        @POST(UPLOAD_FILE_TO_AWS_URL)
        Call<BasicResponse> uploadCropImage(
                @Header(MOBILE_AUTH) String authToken,
                @Header(FARMER_ID) String farmerId,
                @Body CropImageRequest cropImageRequest);
    }
        public static void uploadCropImage(String authToken, String farmerId, CropImageRequest cropImageRequest, Callback<BasicResponse> callback) {
                UploadCropImageApi uploadCropImageApi = retrofit.create(UploadCropImageApi.class);
                Call<BasicResponse> call = uploadCropImageApi.uploadCropImage(authToken, farmerId, cropImageRequest);
                call.enqueue(callback);
    }

На стороне Spring я разработал контроллер, который обрабатывает запросы API и загружает переданное изображение в S3 ->

@RequestMapping(value = "/UploadCropImage",method = RequestMethod.POST,produces = "application/json")
    @ResponseBody
    public String UploadImage(@RequestBody CropImageRequest cropImageRequest,HttpServletRequest request) {
        uuid = new UUIDUtils();
        fileUtils = new FileUtils();
        try {
            String KeyName = uuid.GenerateUUID(fileUtils.convert(cropImageRequest.getCropImage()));
            System.out.println(KeyName);
            return mAmazonClient.uploadImage(KeyName,cropImageRequest.getCropImage());
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return null;
        }
    }

Это моя функция Convert, которая преобразует файл MultiPart в файл.

public String convert(MultipartFile file) throws IOException {
        if(file!=null){
            File convFile = new File(file.getOriginalFilename());
            convFile.createNewFile();
            FileOutputStream fos = new FileOutputStream(convFile);
            fos.write(file.getBytes());
            fos.close();
            return convFile.getName();
        }
        else{
            System.out.println("Supplied File is null");
            return null;
        }       
    }

Проблема в том, что я получаю исключение Null Pointer, со стороны Spring, условную проверку. Это означает, что файл не загружается. На Android Side я подтвердил, распечатав имя файла, и он печатает правильное имя файла. Кстати, я загружаю файл формата .WebP, я не думаю, что это создает какие-либо проблемы здесь. Заранее спасибо за помощь.

1 Ответ

0 голосов
/ 16 ноября 2018

вы отправляете вашу информацию, используя multipart / form-data поэтому попробуйте использовать

@ ModelAttribute

вместо

@ RequestBody

подпись метода будет

public String UploadImage(@ModelAttribute CropImageRequest cropImageRequest,HttpServletRequest request)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...