在android中使用retrofit将图像上传到服务器

时间:2017-09-11 12:14:37

标签: android retrofit2 multipart

我正在开发一个应用程序,我需要在服务器上传图像我无法使用改造上传服务器上的图像我不会因使用相同的代码而上传图像另一个应用。以下是我的代码。

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

请告诉我这段代码究竟是什么错误 欢迎任何帮助。

2 个答案:

答案 0 :(得分:0)

您生成的JSON格式不正确。获取输出并使用https://jsonformatter.curiousconcept.com/等服务对其进行测试,以查看问题所在。

您的改造呼叫应该如下所示:

@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);

答案 1 :(得分:0)

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

开头
{

或者,如果您使用的是GSON,则可以设置:

.setLenient()

接受格式错误的JSON

编码好!