gpt4 book ai didi

java - 通过 Retrofit 从 Android 向 Spring 发送图像文件

转载 作者:行者123 更新时间:2023-11-29 23:27:19 25 4
gpt4 key购买 nike

我正在尝试通过 Spring 通过 Retrofit 将图像上传到 S3。所以,这基本上是 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 方面,我开发了一个 Controller ,它处理 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 函数,它将多部分文件转换为文件。

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 端收到空指针异常,条件检查。这意味着文件没有被上传。在 Android 端,我已经通过打印文件名进行了验证,并且正在打印正确的文件名。顺便说一句,我正在上传 .WebP 格式的文件,我认为这不会造成任何问题。提前感谢您的帮助。

最佳答案

您正在使用multipart/form-data 发送您的信息所以尝试使用

@ModelAttribute

代替

@RequestBody

方法签名将是

public String UploadImage(@ModelAttribute CropImageRequest cropImageRequest,HttpServletRequest request)

关于java - 通过 Retrofit 从 Android 向 Spring 发送图像文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53343332/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com