【问题标题】:Image uploading with other parameters Android使用其他参数 Android 上传图片
【发布时间】:2023-03-22 05:26:01
【问题描述】:

我想用其他 5 个参数在改造 API 上上传图像,我尝试了 stackoverflow 上列出的所有方法,但没有成功。我从服务器收到500 Internal Server Error{"message":"Unexpected token - in JSON at position 0"} 这个回复。我在 POSTMAN 中尝试过,但 API 在其中运行良好。你能告诉我哪里做错了吗?

接口代码。

@Multipart
@Headers({"Content-Type: application/json;charset=UTF-8"})
@POST("uploaddoc")
Call<UploadDocuments> uploadDocuments(@PartMap Map<String, RequestBody> requestBodyMap,
                                      @Part MultipartBody.Part file,
                                      @Header("Authorization") String auth);

API 调用在活动中。

private void uploadImage(String imagePath) {
    File file = new File(imagePath);
        
    RequestBody requestFile = RequestBody.create(file, MediaType.parse("multipart/form-data"));
    MultipartBody.Part body = MultipartBody.Part.createFormData("file", file.getName(), requestFile);

    Map<String, RequestBody> requestBodyMap = new HashMap<>();
    requestBodyMap.put("label", RequestBody.create(encryptedLabel, MediaType.parse("multipart/form-data")));
    requestBodyMap.put("role", RequestBody.create(encryptedRole, MediaType.parse("multipart/form-data")));
    requestBodyMap.put("userobjid", RequestBody.create(encryptedUserObjId, MediaType.parse("multipart/form-data")));
    requestBodyMap.put("whichtype", RequestBody.create(encryptedWhichType, MediaType.parse("multipart/form-data")));
    requestBodyMap.put("gsttype", RequestBody.create(encryptedGstinSpinner, MediaType.parse("multipart/form-data")));
        
    Call<UploadDocuments> documentsCall = equibiz_api_interface.uploadDocuments(requestBodyMap, body,"Bearer " + AuthToken);
    documentsCall.enqueue(new Callback<UploadDocuments>() {
        @Override
        public void onResponse(@NotNull Call<UploadDocuments> call, @NotNull Response<UploadDocuments> response) {
            UploadDocuments uploadDocuments1 = response.body();
            assert uploadDocuments1 != null;
            if(response.isSuccessful())
                Toast.makeText(VerificationActivity.this, response.message(), Toast.LENGTH_SHORT).show();
            else{
                try {
                    assert response.errorBody() != null;
                    Toast.makeText(VerificationActivity.this, response.errorBody().string(), Toast.LENGTH_SHORT).show();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        @Override
        public void onFailure(@NotNull Call<UploadDocuments> call, @NotNull Throwable t) {
            if (t instanceof SocketTimeoutException)
                Toast.makeText(VerificationActivity.this, "Socket Time out. Please try again.", Toast.LENGTH_LONG).show();
            else
                Toast.makeText(VerificationActivity.this, t.toString(), Toast.LENGTH_LONG).show();
        }
    });
}

邮递员截图(授权令牌添加到标题部分)

【问题讨论】:

  • “我在 POSTMAN 中尝试过,但 API 在其中运行良好” 如果您 edit 提出问题并在此处附上 Postman 屏幕截图,将会很有帮助。 500 Internal Server 指出您在服务器脚本中存在一些问题。所以,首先,在这里附上屏幕截图,我们会看看有什么问题。
  • @Shashanth 我已添加,请立即查看。

标签: java android file-upload retrofit2 multipart


【解决方案1】:

我浏览了 Postman 屏幕截图和您的代码。代码有一些问题。以下是问题和解决方案。

  1. 图像/文件的字段名称是documentimages,而不是file。更改字段名称,如下所示。

    RequestBody requestFile = RequestBody.create(file, MediaType.parse("multipart/form-data"));
    MultipartBody.Part body = MultipartBody.Part.createFormData("documentimages", file.getName(), requestFile);
                                                                //^^^^^^ NOTICE THE CHANGES HERE
    
  2. 对于文本字段(与文件一起发送的数据),将 MediaTye 设置为 text/plain 而不是 multipart/form-data。例如,

    requestBodyMap.put("gsttype", RequestBody.create(encryptedGstinSpinner, MediaType.parse("text/plain")));
    

    如上所示,您还需要将其更改为其他文本字段。

  3. 您使用的标题不正确。如果您在此处使用@Headers({"Content-Type: application/json;charset=UTF-8"}) 作为内容类型,则改造假定您从客户端发送到服务器的数据是 JSON,而不是多部分表单数据。如果您从服务器获取 JSON 作为上传文件的响应,那么您可以像下面这样进行。

    @Multipart
    @Headers({"Accept: application/json;"})   // <===== CHANGE HEADER TYPE FROM Content-Tye to Accept   
    @POST("uploaddoc")
    Call<UploadDocuments> uploadDocuments(@PartMap Map<String, RequestBody> requestBodyMap,
                                   @Part MultipartBody.Part file,
                                   @Header("Authorization") String auth);
    

    检查标题部分。

如果您想了解更多有关标头的信息,请参阅此thread

【讨论】:

    猜你喜欢
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    相关资源
    最近更新 更多