通过 Retrofit 将图像文件从 Android 发送到 Spring

2024-03-01

我正在尝试通过 Spring 将 Image 通过 Retrofit 上传到 S3。所以,这基本上是两个任务。

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

这是我的转换函数,它将多部分文件转换为文件。

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 格式文件,我认为这不会造成任何问题。提前感谢您的帮助。


您正在使用以下方式发送您的信息多部分/表单数据所以尝试使用

@ModelAttribute

代替

@RequestBody

方法签名将是

public String UploadImage(@ModelAttribute CropImageRequest cropImageRequest,HttpServletRequest request)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过 Retrofit 将图像文件从 Android 发送到 Spring 的相关文章

随机推荐

  • 如何在 playwright-java 中切换到新选项卡或窗口?

    我们如何切换到运行测试时打开的新窗口 以及如何返回到 playwright java 中的父窗口 没有像 Selenium 这样的 Switch 操作 您可以使用waitForPage or waitForPopup功能 您只需要知道触发该
  • C 迭代结构体数组

    说我已经声明了一个结构 struct mystruct char a 10 double b struct mystruct array 20 test1 1 0 test2 2 0 lt I just want to declare 2
  • XML 标签、属性及其定义

    我正在寻找一个包含所有 XML 标签及其属性以及这些属性的定义 即它们影响 执行的操作 的列表的地方 我认为 MSDN W3C 甚至 Stack Overflow 上都会有这个 但我在这两个地方以及其他地方都找不到它 可能我在这些网站上查找
  • R 中的波形点 (~.)

    谁能解释一下 R 中的波形点 我已经看过一些关于它的帖子 我知道波形符用于公式 指定自变量和因变量 而且 我知道点用于指示所有其他变量 更具体地说 有人可以解释这个例子中的波形点吗 x lt sample 10 x gt detect gt
  • 链接 PHP 文本

    我正在使用 TinySong api 生成链接 它可以工作 现在我尝试使用 linkify 来生成链接 事实并非如此 我不确定为什么它没有链接 我相信我使用了正确的变量 这是代码
  • Java 中的 Perlin 噪声

    对于我正在从事的元胞自动机项目 我需要使用不同的算法和技术随机生成二维布尔数组 目前 我在应用程序中只有一种类型的随机化 循环遍历数组中的每个单元格并生成随机双变量 然后如果随机数高于 0 5 则将该单元格设置为 true 如果不是 则设置
  • 未定义的子例程 &main::首先在 hello.pl 第 6 行调用

    我的 Perl 代码面临一个问题 我创建了一个包 Welcome pm 并在脚本 hello pl 中使用它 但出现以下错误 未定义子例程 main First 在 hello pl 第 6 行调用 我也查看了其他答案 但仍然无法弄清楚代码
  • 无法在 Android 上显示实时流数据

    我正在尝试将原始 H264 数据从相机设备显示到我的 Android 应用程序 我能够在 Textview 上接收数据 但无法在 Textureview 上显示它 我是 android 的初学者 我不是解码原始数据的专家 如果有人能提出解决
  • Android Webview 加载对话框没有被关闭

    我正在使用以下代码 class CustomWebViewClient extends WebViewClient Context context ProgressDialog pd null public CustomWebViewCli
  • 如何写入或读取 XML 配置文件 (.config)

    我必须在安装的后期部分编写一个配置文件 如果存在旧版本的产品 则必须从配置文件中读取 配置文件是 XML 配置文件 config 配置文件将有很多条目 例如
  • .css .js 文件上的 php-fpm apache2 403 错误

    我正在尝试在 debian jessie 上设置一个具有多个虚拟主机的 apache2 服务器 我希望他们每个人都有一个不同的 FastCgiExternalServer 我在 jessie 上使用 php5 fpm 包中的 php 版本以
  • Pandas 将计算行添加到数据框的底部

    下面是我拥有的数据框的一个小样本 我想在其底部添加一个计算行 sch q1 q2 q3 acc Yes Yes No acc Yes No No acc Yes No No acc Yes Yes Yes 我想在底部添加一行 该行将给出每列
  • mysql查询生成序列号

    我有一张表 student marks marks 44 55 64 98 76 预期输出 serial number marks 1 44 2 55 3 64 4 98 5 76 使用 mysql 用户定义的变量 可以使用查询来完成 se
  • 单元测试 Swagger 输出

    我在 ASP NET MVC WebAPI 项目中使用 Swagger 该项目安装了 Swashbuckle nugget 包并生成 Swagger UI 和 Swagger docs v1 我一直遇到的一个问题是 开发人员会因为不仔细命名
  • Python 中的基本日志记录 dictConfig

    NOTE我知道这个答案 https stackoverflow com questions 7507825 python complete example of dict for logging config dictconfig但这对我不
  • 在 CSV 导出中输出列标题

    我有一个导出到 csv 文件的查询 它工作得很好 唯一我不明白的是我还需要导出列标题 并将它们显示为全名 用户名 标志和原因 下面是代码 它可以很好地导出所有行 但我不确定如何导出受尊重的行上方的列标题 header Content typ
  • 如何让 ocaml 相信两个函子实例化是相等的

    假设我有许多模块 它们都使用一种模块类型进行参数化 并且彼此之间也具有依赖关系 module type AT sig end module B A AT struct module Hash struct type t int let eq
  • 调试 R 中的通用函数

    如何调试通用函数 使用 debug 或调试包中的 mtrace 举个例子 我想调试 NADA 包中的 cenreg 特别是采用公式输入的方法 您可以像这样检索方法详细信息 library NADA getMethod cenreg c fo
  • 在 iPhone 上用手指画直线

    背景 我正在尝试创建一个非常简单的 iPhone 应用程序 允许用户用手指在屏幕上绘制多条直线 我在我的程序中使用这两种方法UIViewController捕获每条线端点的坐标 void touchesBegan NSSet touches
  • 通过 Retrofit 将图像文件从 Android 发送到 Spring

    我正在尝试通过 Spring 将 Image 通过 Retrofit 上传到 S3 所以 这基本上是两个任务 将图像传递给 Spring API 从 Spring API 将其上传到 S3 服务器 我知道如何将图像上传到 S3 并且工作正常