【问题标题】:Image Upload issue in Retrofit 2Retrofit 2 中的图像上传问题
【发布时间】:2021-08-28 01:31:02
【问题描述】:

我是 android 的初学者,正在尝试从我的设备上传图片,上传时遇到问题,但 Api 没有响应。在邮递员中,我已经上传了工作正常的图像,但我怎样才能在 android studio 中实现这一点。下面是我的主要java。请帮我解决问题

public class TheProfileActivity extends AppCompatActivity {
    Button buttonUpload;
    UserNumber userNumber;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_the_profile);

        buttonUpload = findViewById(R.id.btn_upload_file);
        userNumber = ApiNetClient.getRetrofits().create(UserNumber.class);

        buttonUpload.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Intent galleryIntent = new Intent(Intent.ACTION_PICK,
                        android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                startActivityForResult(galleryIntent, 1);
            }
        });
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == 1 && data != null) {

            Uri uri = data.getData();

            uploadFile(uri);

        }
    }
    private void uploadFile(Uri uriFile) {
        File file = new File(getRealPath(uriFile));
        RequestBody requestBody = RequestBody.create(MediaType.parse(getContentResolver().getType(uriFile)), file);

        MultipartBody.Part profileImage = MultipartBody.Part.createFormData("image",file.getName(),requestBody);

        Call<ResponseImages> call = userNumber.UploadImage(profileImage);

        call.enqueue(new Callback<ResponseImages>() {
            @Override
            public void onResponse(Call<ResponseImages> call, Response<ResponseImages> response) {

                ResponseImages response1= response.body();

                if (response.isSuccessful()){

                    Gson gson = new Gson();
                    String successResponse = gson.toJson(response.body());
                    Toast.makeText(TheProfileActivity.this, successResponse, Toast.LENGTH_SHORT).show();
                }else{
                    Toast.makeText(TheProfileActivity.this, "no resp", Toast.LENGTH_SHORT).show();
                }
            }
            @Override
            public void onFailure(Call<ResponseImages> call, Throwable t) {
            }
        });
    }
    private String getRealPath(Uri contentUri){

        String[]  proj = {MediaStore.Images.Media.DATA};

        CursorLoader cursorLoader = new CursorLoader(this,contentUri,proj,null,null,null);
        Cursor cursor = cursorLoader.loadInBackground();

        assert cursor != null;
        int columIndex = cursor.getColumnIndex(MediaStore.Images.Media.DATA);

        cursor.moveToFirst();

        String result = cursor.getString(columIndex);
        cursor.close();

        return result;
    }
}

这是接口类

@Multipart
    @POST("Upload_Image")
    Call<ResponseImages> UploadImage(
            @Part MultipartBody.Part image);

【问题讨论】:

  • 你能登录file.getName()得到正确的结果吗?

标签: java android android-studio retrofit2


【解决方案1】:

试试这个也许可行:

尝试从 uri 获取输入流,而不是获取文件路径:

InputStream is = getContentResolver().openInputStream(Urifile);

现在将此流转换为bytearray 并上传到服务器

【讨论】:

    【解决方案2】:

    这样试试

    @Multipart
    @POST("Upload_Image")
    Call<ResponseBody> uploadImage(@Part("file\"; fileName=\"myFile.png\" ")RequestBody requestBodyFile, @Part("image") RequestBody requestBodyJson);
    
    
    File imgFile = new File("YOUR IMAGE FILE PATH");
    RequestBody requestBodyFile = RequestBody.create(MediaType.parse("image/*"), imgFile);
    RequestBody requestBodyJson = RequestBody.create(MediaType.parse("text/plain"),
                      retrofitClient.getJsonObject(uploadRequest));
    
    
    
    Call<ResponseBody> uploadBundle = uploadImpl.uploadImage(requestBodyFile, requestBodyJson);
    Response<BaseResponse> response = uploadBundle.execute();
    

    【讨论】:

    • RequestBody requestBodyJson = RequestBody.create(MediaType.parse("text/plain"), retrofitClient.getJsonObject(uploadRequest));什么是上传请求
    猜你喜欢
    • 1970-01-01
    • 2018-04-11
    • 2018-07-04
    • 2017-02-18
    • 1970-01-01
    • 2015-11-17
    • 2017-09-28
    • 2017-10-07
    相关资源
    最近更新 更多