使用RequestBody

时间:2015-10-29 05:08:58

标签: php android retrofit

我正在尝试将图片发布到服务器。这是我在脚本服务器提供给我的服务器端的php变量名:

$value1 = $_POST["value1"]; // string value
$value2 = $_POST["value2"]; // string value

$img_1 = $_FILES["fileToUpload1"]["name"]; // image file
$img_2 = $_FILES["fileToUpload2"]["name"]; // image file

这是我发布值的代码 -

RequestBody fileBody = RequestBody.create(MediaType.parse("image/png"), path.toString());
RequestBody fileBody1 = RequestBody.create(MediaType.parse("image/png"), path.toString());

Call<uploadResponseModel> call = adapter.uploadValues("test1","test2",fileBody1,fileBody);

call.enqueue(new Callback<uploadResponseModel>() {
    @Override
    public void onResponse(Response<uploadResponseModel> response, Retrofit retrofit) {
         Log.i("TAG", "retro onResponse :" + response.body().getResponse().getStatus());
    }

    @Override
    public void onFailure(Throwable t) {
        Log.i("TAG", "retro onFailure :" + t.getCause());
    }
});

适配器类:

public interface RetrofitAdapter {
 @Multipart
 @POST("/TestApp/img_upload.php")
 Call<uploadResponseModel> uploadValues(@Part("value1")String  value1,@Part("value2")String  value2,@Part("fileToUpload1") RequestBody file1,@Part("fileToUpload2") RequestBody file2);
}

两个字符串值都会在服务器上发布,但不会在图像上发布。如果我在发布图像文件的任何地方出错,请纠正我。我是新来的改造。

6 个答案:

答案 0 :(得分:6)

根据您的问题,服务器期望的变量是两个图像(文件)fileToUpload1fileToUpload2。上传图片的原因是您在RetrofitAdapter中指定的语法。

您必须将RetrofitAdapter更改为:

public interface RetrofitAdapter {
 @Multipart
 @POST("/TestApp/img_upload.php")
 Call<uploadResponseModel> uploadValues(@Part("value1")String  value1,@Part("value2")String  value2,@Part("fileToUpload1\"; filename=\"image\" ") RequestBody file1,@Part("fileToUpload2\"; filename=\"image\" ") RequestBody file2);
}
  

@Part(&#34; fileToUpload1 \&#34 ;; filename = \&#34; image \&#34;&#34;)RequestBody file1

服务器需要具有变量名fileToUpload1fileToUpload2的文件,该文件必须与上述格式的文件名一起发布。你也可以在这里引用解决方案click here

这样做你很高兴:)

答案 1 :(得分:2)

这是我的多部分文件上传服务方法:

@Multipart
@POST("http://....")
Call<UploadResponse> uploadPicture(@PartMap Map<String,RequestBody>  pic1, @PartMap Map<String, RequestBody> pic2);

如何称呼它:

  public void uploadPicture(File pic1, File pic2) {
      Map<String, RequestBody> pic1Map = new HashMap<>();
      Map<String, RequestBody> pic2Map = new HashMap<>();
      RequestBody rb1 = RequestBody.create(MediaType.parse("image/*"), pic1);
      RequestBody rb2 = RequestBody.create(MediaType.parse("image/*"), pic2);
      pic1Map.put("file\"; filename=\"" + pic1.getName(), rb1);
      pic2Map.put("file\"; filename=\"" + pic2.getName(), rb2);

      Call<UploadResponse> call = apiClient.getAPIService().uploadPicture(pic1Map, pic2Map); 
      call.enqueue...
  }

有些后端需要filename头参数,这就是我用@PartMap这种方式的原因。 OkHttp的多部分构建器没有设置它。

答案 2 :(得分:0)

而不是RequestBody只使用RequestBody。在Retrofit界面中修复方法uploadValues

           public interface RetrofitAdapter {
           @Multipart
           @POST("/TestApp/img_upload.php")
           Call<uploadResponseModel> uploadValues(@Part("value1")String  value1,@Part("value2")String  value2,@Part("fileToUpload1") TypedFile file1,@Part("fileToUpload2") TypedFile file2);
           }

并修复您的请求服务:

           TypedFile file1 = new TypedFile("application/octet-stream", new File(path1));
           TypedFile file2 = new TypedFile("application/octet-stream", new File(path2));
           Call<uploadResponseModel> call = adapter.uploadValues("test1","test2",file1,file2);

           call.enqueue(new Callback<uploadResponseModel>() {
               @Override
               public void onResponse(Response<uploadResponseModel> response, Retrofit retrofit) {
                   Log.i("TAG", "retro onResponse :" + response.body().getResponse().getStatus());

               }

               @Override
               public void onFailure(Throwable t) {
                   Log.i("TAG", "retro onFailure :" + t.getCause());

               }
           });

答案 3 :(得分:0)

您正在调用RequestBody的错误$ sudo npm install -g ionic方法。您正在传递一个字符串,该字符串使用字符串作为内容。您需要传递create。目前尚不清楚File变量的类型。如果它已经是path,请使用它。否则,创建一个文件并将其传递给File -

create

File image = new File(path.toString()); RequestBody fileBody = RequestBody.create(MediaType.parse("image/png"), image); 执行相同操作。

答案 4 :(得分:0)

我认为发送普通字符串和文件的方法是不同的。

你应该使用

@Part("file\"; filename=\"fileToUpload1.png\"") RequestBody file1

而不是

@Part("fileToUpload1") RequestBody file1

或者如果您想要具体

@Part("image\"; filename=\"fileToUpload1.png\"") RequestBody file1

答案 5 :(得分:-1)

使用改装@Multipart标记上传多部分文件时存在一些问题。

使用@POST标记解决了问题,并在请求正文中使用自定义多部分构建器。

@POST ("userwebservices/app_upload_pic")
Call<APIRespone> uploadUserImages ( @Body RequestBody file );

通过传递从Android应用程序获取的图像文件路径来进行分段上传的代码。

 File file = new File(filePath);

 MediaType MEDIA_TYPE_IMAGE = MediaType.parse("image/*");
 RequestBody requestBody = new MultipartBuilder()
         .type(MultipartBuilder.FORM)
         .addPart(
                 Headers.of("Content-Disposition", "form-data;name=\"uploaded_file\";filename=\"" + filePath + "\""),
                 RequestBody.create(MEDIA_TYPE_IMAGE, file))
         .build();

这里uploaded_file是PHP脚本中的检查字符串。