【问题标题】:Upload file in Retrofit 2在 Retrofit 2 中上传文件
【发布时间】:2016-08-31 04:01:12
【问题描述】:

我尝试了以下操作,但在响应时我收到 500 错误(内部服务器错误)--帮助我为上述屏幕截图中的请求设计接口...谢谢

@Multipart
@POST("myrecord")
Call<ResponseBody> addRecord(@Query("token") String token,@Query("userid") int userId,
                             @Query("name") String name, @Part("file") RequestBody file);


File file = new File(getRealPathFromURI(data.getData()));
RequestBody requestFile = RequestBody.create(MediaType.parse("image/*"), getRealPathFromURI(data.getData()));` 
Call<ResponseBody> responseBodyCall = service.addRecord(token, userId,
                "newFileName", requestFile);
        responseBodyCall.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                Log.d("Response", "="+response.code());
                Log.d("Response", "= "+response.message());

            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
                Log.d("failure", "message = " + t.getMessage());
                Log.d("failure", "cause = " + t.getCause());
            }
        });`

【问题讨论】:

  • 尝试删除@Multipart
  • @MobDev 没用兄弟..

标签: android android-studio retrofit2


【解决方案1】:

以下代码有效:)

 @Multipart
@POST("myrecord")
Call<ResponseBody> addRecord(@Query("token") String token, @Query("userid") int userId,
                             @Query("name") String name, @Part MultipartBody.Part file);



 @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if ((requestCode == FILE_SELECT_CODE) && (resultCode == -1)) {

        File file = new File(getRealPathFromURI(data.getData()));

        RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), getRealPathFromURI(data.getData()));

        MultipartBody.Part multipartBody =MultipartBody.Part.createFormData("file",file.getName(),requestFile);

        Call<ResponseBody> responseBodyCall = service.addRecord(token, userId, "fileName", multipartBody);
        responseBodyCall.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                Log.d("Success", "success "+response.code());
                Log.d("Success", "success "+response.message());

            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
                Log.d("failure", "message = " + t.getMessage());
                Log.d("failure", "cause = " + t.getCause());
            }
        });

    }
}

【讨论】:

  • 请您更新getRealPathFromURI()方法?
  • 我有一个问题,我正在尝试这段代码,但现在我很困惑如何创建在上述 android 代码中正常工作的 asp.net Web 服务。我已经试过了。有关更多信息,请参阅此stackoverflow.com/q/57909118/10325004 并请帮助我。
【解决方案2】:
@Multipart
@POST("myrecord")
Call<ResponseBody> addRecord(@Part("file") RequestBody file,@Part MultipartBody.Part file,
@Query("token") String token,@Query("userid") int userId,@Query("name") String name);

RequestBody requestFile =
        RequestBody.create(MediaType.parse("multipart/form-data"), file);

MultipartBody.Part body =
        MultipartBody.Part.createFormData("picture", file.getName(), requestFile);


String descriptionString = "your description";

RequestBody description =
        RequestBody.create(
                MediaType.parse("multipart/form-data"), descriptionString);

有关更多信息,请查看此链接: https://futurestud.io/blog/retrofit-2-how-to-upload-files-to-server

【讨论】:

    【解决方案3】:

    如果您想在正文中以二进制形式发送文件而不使用 multipart,您可以从代码中删除 @Multipart 注释并使用 @Body 注释。好像

    @POST("myrecord")
    Call<ResponseBody> addRecord(@Query("token") String token,@Query("userid") int userId,
                                 @Query("name") String name, @Body RequestBody file);
    
    
    File file = new File(getRealPathFromURI(data.getData()));
    RequestBody requestFile = RequestBody.create(MediaType.parse("image/*"), getRealPathFromURI(data.getData()));
    Call<ResponseBody> responseBodyCall = service.addRecord(token, userId,
                    "newFileName", requestFile);
            responseBodyCall.enqueue(new Callback<ResponseBody>() {
                @Override
                public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                    Log.d("Response", "="+response.code());
                    Log.d("Response", "= "+response.message());
            }
    
            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
                Log.d("failure", "message = " + t.getMessage());
                Log.d("failure", "cause = " + t.getCause());
            }
        });`
    

    【讨论】:

    • 这种方式和Multipart方式有什么区别?在这两种情况下,文件都将作为二进制发送,对吗?
    • @Mena multipart 用于发送“多个主体”,例如多个文件或文件和 json,或多个 json(如果需要)。如果您只需要发送 1 个文件,则此方法更好。无论如何取决于服务器端配置
    【解决方案4】:
        public String getRealPathFromURI(Context context, Uri contentUri) {
        Log.d("imin", "onClick: in image conversion");
    
        Cursor cursor = null;
        try {
            String[] proj = {MediaStore.Images.Media.DATA};
            cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
            int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();
            Log.d("imin", "onClick: in image conversion try");
    
            return cursor.getString(column_index);
        } finally {
            Log.d("imin", "onClick: in image conversion finally");
    
            if (cursor != null) {
                cursor.close();
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-04
      • 2017-02-18
      • 2017-05-14
      • 2017-07-02
      • 1970-01-01
      • 2017-03-28
      • 1970-01-01
      相关资源
      最近更新 更多