使用Retrofit2将图像上载到服务器POST请求

问题描述:

我想使用Retrofit2将我的图库图像上传到服务器。 API有1个参数,其中包含flie作为表单数据&另一个参数是带有键的标题。当我将图像上传到服务器时,我从服务器收到“找不到文件”消息。我正在发送正确的文件名,但我不知道它为什么给出这样的答案。任何人都可以帮助我解决问题。以下是我的代码。使用Retrofit2将图像上载到服务器POST请求

final ProgressDialog progressDialog; 
     progressDialog = new ProgressDialog(UserProfileActivity.this); 
     progressDialog.setMessage("Updating Data"); 
     progressDialog.show(); 

     //Create Upload Server Client 
     ApiService service = RetroClient.getApiService(); 

     //File creating from selected URL 
     File file = new File(imgDecodableString); 
     Log.d("TAG","file="+file.getName()); 
     // create RequestBody instance from file 
     RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file); 

     // MultipartBody.Part is used to send also the actual file name 
     MultipartBody.Part body = 
       MultipartBody.Part.createFormData("image", file.getName(), requestFile); 

     Call<com.example.datamodel.Response> resultCall = service.uploadImage(loginHash,body); 

     resultCall.enqueue(new Callback<com.example.datamodel.Response>() { 
      @Override 
      public void onResponse(Call<com.example.datamodel.Response> call, retrofit2.Response<com.example.datamodel.Response> response) { 
       com.example.datamodel.Response mBean = response.body(); 
       if(null != mBean) 
       { 
        Log.d("TAG","RS="+mBean.getMessage()); 
        Log.d("TAG","RS="+mBean.getData().getvImage()); 
       } 

       progressDialog.dismiss(); 
      } 

      @Override 
      public void onFailure(Call<com.example.datamodel.Response> call, Throwable t) { 
       progressDialog.dismiss(); 
       Log.d("TAG", "fail=" + t.getMessage()); 
      } 
     }); 

RetroClient.java

public class RetroClient { 
public RetroClient() { 

} 
private static Retrofit getRetroClient() { 
    return new Retrofit.Builder() 
      .baseUrl(AppConstants.BASE_URL) 
      .addConverterFactory(GsonConverterFactory.create()) 
      .build(); 
} 

public static ApiService getApiService() { 
    return getRetroClient().create(ApiService.class); 
}} 

ApiService.java

public interface ApiService { 
@Multipart 
@POST("api/User/uploadUserProfilePhoto") 
Call<Response> uploadImage(@Header("vLoginHash") String vLoginHash,@Part MultipartBody.Part file);} 

在logcat的我越来越找不到文件从服务器消息。任何人都请帮忙。提前致谢。

+0

使用这可能是它的帮助http://*.com/a/40608320/5305430 – sushildlh

+0

@sushildlh我已经做到了这一点,也改变了MediaType.parse(“image/*”),但仍然是相同的错误 –

没有多

@POST("/api/name.jpg") 
     Call<Object> upload(
       @Header("header_name") String authorization, 
       @Body RequestBody body); 

尝试OnActivityREsult

 if (resultCode == Activity.RESULT_OK) { 

       Bitmap photo = null; 
      if(requestCode==REQUEST_GALLERY){ 
        try { 
         photo = MediaStore.Images.Media.getBitmap(getActivity().getApplicationContext().getContentResolver(), data.getData()); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
       // CALL THIS METHOD TO GET THE URI FROM THE BITMAP 
       if(photo!=null){ 
        Uri tempUri = getImageUri(getActivity(), photo); 
        // CALL THIS METHOD TO GET THE ACTUAL PATH 
        File finalFile = new File(getRealPathFromURI(tempUri)); 
        RequestBody requestBody = RequestBody.create(MediaType.parse("*/*"), file); 
      apimy.upload(header value,requestBody).enque...    
       } 
      } 

public Uri getImageUri(Context inContext, Bitmap inImage) { 
     ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
     inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes); 
     String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null); 
     return Uri.parse(path); 
    } 

    public String getRealPathFromURI(Uri uri) { 
     Cursor cursor = getActivity().getContentResolver().query(uri, null, null, null, null); 
     assert cursor != null; 
     cursor.moveToFirst(); 
     int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); 
     return cursor.getString(idx); 
    } 

此代码工作正常,我。

+0

Getting Body参数不能与格式或多部分编码一起使用。 –

+0

删除@Multipart在你的界面上面的帖子行 –

+0

我已经删除它,但结果相同。 –