복붙노트

[SPRING] Android에서 Spring으로 개조를 통해 이미지 파일 보내기

SPRING

Android에서 Spring으로 개조를 통해 이미지 파일 보내기

Spring을 통해 S3에 Retrofit을 통해 Image를 업로드하려고합니다. 기본적으로 2 가지 작업입니다.

S3에 이미지를 업로드하는 방법을 알고 잘 작동합니다.

내 문제가 첫 번째 부분입니다. 나는 그물에 많은 솔루션을 시도했지만 작동하지 않았다. 여기 내 코드 ->

안드로이드 측에서, 먼저 파일 받기 및 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());
                }
            });
        }
    }

기본적으로 Request Body의 POJO 클래스 인 cropImageRequest.java를 만들었습니다. 내 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 측에서는 S3에 API Request 및 Uploads Passed Image를 처리하는 컨트롤러를 개발했습니다.

@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;
        }
    }

이것은 MultiPart File을 File로 변환하는 Convert 기능입니다.

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;
        }       
    }

문제는 Spring 측에서 Null Pointer Exception을 얻고 있다는 것입니다. 조건부 검사. 즉, 파일이 업로드되지 않습니다. Android 측면에서는 파일 이름을 인쇄하여 올바른 파일 이름을 인쇄했는지 확인했습니다. BTW 나는 .WebP 형식의 파일을 업로드하고 있는데, 나는 그것이 어떤 문제도 발생시키지 않는다고 생각한다. 도움에 미리 감사드립니다.

해결법

  1. ==============================

    1.multipart / form-data를 사용하여 정보를 보내고 있습니다. 그래서 사용해보십시오.

    multipart / form-data를 사용하여 정보를 보내고 있습니다. 그래서 사용해보십시오.

    대신에

    메소드 서명은

    public String UploadImage(@ModelAttribute CropImageRequest cropImageRequest,HttpServletRequest request)
    
  2. from https://stackoverflow.com/questions/53343332/send-image-file-via-retrofit-from-android-to-spring by cc-by-sa and MIT license