【问题标题】:Image is not uploaded to server using retrofit in android图像未在 android 中使用改造上传到服务器
【发布时间】:2018-02-19 16:28:43
【问题描述】:

我正在开发一个应用程序,我需要在服务器上上传图像我无法使用改造在服务器上上传图像我不知道使用相同的代码会出现什么问题我在另一个应用程序中上传图像.以下是我的代码。

   protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(requestCode == REQUEST_GALLERY_CODE && resultCode == Activity.RESULT_OK){
            uri = data.getData();
            if(EasyPermissions.hasPermissions(this, Manifest.permission.READ_EXTERNAL_STORAGE)) {
                String filePath = getRealPathFromURIPath(uri, ProfileActivity.this);
                File file = new File(filePath);
                iv_user_profile_image.setImageURI(uri);

                Log.d(TAG, "Filename " + file.getName());

                RequestBody mFile = RequestBody.create(MediaType.parse("image/*"), file);
                MultipartBody.Part fileToUpload = MultipartBody.Part.createFormData("file", file.getName(), mFile);
                RequestBody filename = RequestBody.create(MediaType.parse("text/plain"), file.getName());
                RequestBody uid = RequestBody.create(MediaType.parse("text/plain"), loginStatusModal.getUser_id());

                WebClient uploadImage = ServiceGenerators.createService(WebClient.class);
                Call<UploadObject> fileUpload = uploadImage.uploadFile(mAuthorizationHeader,fileToUpload/*,uid*/);
                String abc = fileUpload.request().url().toString();
                fileUpload.enqueue(new Callback<UploadObject>() {
                    @Override
                    public void onResponse(Call<UploadObject> call, Response<UploadObject> response) {
                        Toast.makeText(ProfileActivity.this, "Response " + response.raw().message(), Toast.LENGTH_LONG).show();
                        Toast.makeText(ProfileActivity.this, "Success " + response.body().getStatus(), Toast.LENGTH_LONG).show();
                    }
                    @Override
                    public void onFailure(Call<UploadObject> call, Throwable t) {
                        Log.d(TAG, "Error " + t.getMessage());
                    }
                });
            }else{
                EasyPermissions.requestPermissions(this, getString(R.string.read_file), READ_REQUEST_CODE, Manifest.permission.READ_EXTERNAL_STORAGE);
            }
        }
    }

这是我的服务调用代码。每次我运行代码时都会说

  Use JsonReader.setLenient(true) to accept malformed JSON at line 2 column 1 path $

这条消息来了 以下是我的界面

@Multipart
@POST("/api/uploadimage")
Call<UploadObject> uploadFile(@Header("Authorization") String authorizationHeader,
                              @Part MultipartBody.Part file);

请告诉我这段代码到底有什么问题 欢迎任何帮助。

【问题讨论】:

    标签: android retrofit2 multipart


    【解决方案1】:

    您生成的 JSON 格式不正确。获取输出并使用https://jsonformatter.curiousconcept.com/ 之类的服务进行测试,看看问题出在哪里。

    您的 Retrofit 调用应该如下所示:

    @Multipart
    @POST("/api/uploadimage")
    Call<UploadObject> uploadFile(@Header("Authorization") String 
    authorizationHeader, RequestBody file);
    
    
    RequestBody typedFile = RequestBody.create(MediaType.parse("image/*"), file);
    uploadImage.uploadFile(mAuthorizationHeader, typedFile);
    

    【讨论】:

      【解决方案2】:

      问题是 Gson 期待一个对象,但正在接收一个字符串,这是因为 JSON 的格式可能是错误的。 JSON 必须以

      开头
      {
      

      或者如果您使用 GSON,例如,您可以设置:

      .setLenient()
      

      用于接受格式错误的 JSON

      编码不错!

      【讨论】:

      • .setLenient() 也使用了 json 是有效的,但仍然会出现这个错误
      • 请显示使用情况,您的 JSON 响应,我们可以告诉您有关格式的更多信息。
      • { "status": "success", "code": 2001, "image_path": "emr.nullplex.com/uploads/d41/…" }
      • JSON 必须以 " 结尾,而你只有一个 ;。这也是一个错误
      • 您可以随时使用此网站来验证/检查您的 json 响应 jsonlint.com
      猜你喜欢
      • 2019-02-14
      • 2018-10-05
      • 2018-04-03
      • 2021-11-29
      • 1970-01-01
      • 2017-05-21
      • 2021-09-01
      • 1970-01-01
      • 2018-01-23
      相关资源
      最近更新 更多