Я пытаюсь загрузить изображение через Retrofit в S3 через Spring. Итак, это в основном 2 задачи.
- Передача изображения в Spring API
- Из 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, я не думаю, что это создает какие-либо проблемы здесь. Заранее спасибо за помощь.