Spring收到的分段文件为空

时间:2018-11-19 18:44:05

标签: android spring retrofit

我有一个文件,我想将其从Android发送到Spring Backend。在Spring收到映像后,我将通过生成UUID并将其上载到AWS S3来更改映像的名称。我的问题是我得到空值作为响应。

Android Side->

我的Android上传文件功能->

private void UploadFiles() {
        File uploadFile = fileArrayList.get(0);
        if (uploadFile != null) {
            Log.d(TAG, "UploadFiles: File Name is -> " + uploadFile.getName());

            // cropImageRequest.setCropId(uploadFile.getParentFile().getName());

            // Parsing any Media type file
            RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), uploadFile);

            // MultipartBody.Part is used to send also the actual file name
            MultipartBody.Part cropImage = MultipartBody.Part.createFormData("cropImage", uploadFile.getName(), requestFile);

            Api.uploadCropImage(cropImage, new Callback<BasicResponse>() {
                @Override
                public void onResponse(Call<BasicResponse> call, Response<BasicResponse> response) {
                    if (response.body() != null) {
                        Log.d(TAG, "onResponse: Success" + response.body().getResponse());
                    }
                    else{
                        Log.d(TAG, "onResponse: null Response");
                    }
                }

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

** uploadImageFunction-> **

 public static void uploadCropImage(MultipartBody.Part cropImage, Callback<BasicResponse> callback) {
        UploadCropImageApi uploadCropImageApi = retrofit.create(UploadCropImageApi.class);
        Call<BasicResponse> call = uploadCropImageApi.uploadCropImage(cropImage);
        call.enqueue(callback);
    }

我的界面->

public interface UploadCropImageApi {
        @Multipart
        @POST(UPLOAD_FILE_TO_AWS_URL)
        Call<BasicResponse> uploadCropImage(@Part MultipartBody.Part cropImage);
    }

这是我的Spring文件->

@RequestMapping(value = "/UploadCropImage", method = RequestMethod.POST, consumes = {"multipart/form-data"})
    @ResponseBody
    public String UploadImage(@RequestBody MultipartFile cropImage,HttpServletRequest request) {
        mAmazonClient = AmazonClient.GetAmazonClientInstance();
        UUIDUtils uuid = new UUIDUtils();
        try {
            System.out.println(cropImage);
            String KeyName = uuid.GenerateUUID(cropImage.getName());
            String Code = mAmazonClient.uploadImage(KeyName, cropImage);
            System.out.println(Code);
            return Code;
        } catch (Exception e) {
            // TODO Auto-generated catch block
            System.out.println(e.getMessage());
            return null;
        }
    }

此控制器正在打印以下值->

org.springframework.web.multipart.commons.CommonsMultipartFile@b0b5de0
File Name is -: cropImage
null

我的问题是,如您所见,Retrofit发送的文件和Spring接收的文件都不为空,我正在通过AWS发送该文件,但它没有上传文件并返回null作为值。但是当我使用POSTMAN时,它很容易将文件发送到AWS并返回KeyName。

好的,所以我调试了一点,然后在上传图像文件时发现了一个异常。唯一的例外是->文件名,目录名或卷标语法不正确。

1 个答案:

答案 0 :(得分:2)

您的例外情况表明您的文件名有问题。问题是命名约定,因为它正在上载包含“:”符号的文件名,并且可能还有其他符号也未被AWS接受。因此,只需更改文件名,并用_(Underscore)符号而不是“”(space),(:)和其他符号来分隔名称。这将成功将文件上传到AWS。希望对您有所帮助。