Php 改进v2.0.0-beta2如何使用RequestBody上传文件

Php 改进v2.0.0-beta2如何使用RequestBody上传文件,php,android,retrofit,Php,Android,Retrofit,我正在尝试将图像发布到服务器。以下是scriptor提供给我的服务器端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 这是我

我正在尝试将图像发布到服务器。以下是scriptor提供给我的服务器端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());
    }
});
RequestBody fileBody=RequestBody.create(MediaType.parse(“image/png”),path.toString());
RequestBody fileBody1=RequestBody.create(MediaType.parse(“image/png”),path.toString();
Call Call=adapter.uploadValues(“test1”、“test2”、fileBody1、fileBody);
call.enqueue(新回调(){
@凌驾
公共响应(响应、改装){
Log.i(“TAG”,“retro-onResponse:”+response.body().getResponse().getStatus());
}
@凌驾
失效时的公共无效(可丢弃的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);
}
公共接口适配器{
@多部分
@POST(“/TestApp/img_upload.php”)
调用上载值(@Part(“value1”)字符串值1、@Part(“value2”)字符串值2、@Part(“fileToUpload1”)请求体文件1、@Part(“fileToUpload2”)请求体文件2);
}

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

用RequestBody代替RequestBody。改装界面中的修复方法
上传值

           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);
           }
公共接口适配器{
@多部分
@POST(“/TestApp/img_upload.php”)
调用上载值(@Part(“value1”)字符串值1、@Part(“value2”)字符串值2、@Part(“fileToUpload1”)类型文件文件1、@Part(“fileToUpload2”)类型文件2);
}
并修复您的请求服务:

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

               }
           });
TypedFile file1=新的TypedFile(“应用程序/八位字节流”,新文件(路径1));
TypedFile文件2=新的TypedFile(“应用程序/八位字节流”,新文件(路径2));
Call Call=adapter.uploadValues(“test1”、“test2”、file1、file2);
call.enqueue(新回调(){
@凌驾
公共响应(响应、改装){
Log.i(“TAG”,“retro-onResponse:”+response.body().getResponse().getStatus());
}
@凌驾
失效时的公共无效(可丢弃的t){
Log.i(“TAG”,“retro-onFailure:+t.getCause());
}
});

您调用了错误的
创建方法。您正在传递一个字符串,该字符串使用该字符串作为内容。您需要传递一个
文件
。不清楚您的
path
变量是什么类型。如果它已经是一个
文件
,请使用它。否则,创建一个文件并将其传递给
create
--


fileBody1

执行同样的操作,我认为发送普通字符串和文件的方法是不同的

你应该使用

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

@Part("fileToUpload1") RequestBody file1
或者如果你想说得具体一些

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

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

@Multipart
@POST("http://....")
Call<UploadResponse> uploadPicture(@PartMap Map<String,RequestBody>  pic1, @PartMap Map<String, RequestBody> pic2);
@Multipart
@职位(”http://....")
调用uploadPicture(@PartMap-Map-pic1,@PartMap-Map-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...
  }
public void上传图片(文件pic1、文件pic2){
Map pic1Map=newhashmap();
Map pic2Map=newhashmap();
RequestBody rb1=RequestBody.create(MediaType.parse(“image/*”),pic1);
RequestBody rb2=RequestBody.create(MediaType.parse(“image/*”),pic2);
pic1Map.put(“文件\文件名=\”+pic1.getName(),rb1);
pic2Map.put(“文件\文件名=\”+pic2.getName(),rb2);
Call Call=apiClient.getAPIService().uploadPicture(pic1Map,pic2Map);
打电话,排队。。。
}

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

使用改装
@multipart
标签上载多部分文件时存在一些问题

使用
@POST
标记,在请求正文中使用自定义多部分生成器,解决了该问题

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

这里的
upload\u file
是PHP脚本中的检查字符串。

根据您的问题,服务器期望作为两个图像(文件)的变量是
fileToUpload1
fileToUpload2
。图像无法上传的原因是您在
适配器中指定的语法

您必须将
适配器更改为:

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);
}
公共接口适配器{
@多部分
@POST(“/TestApp/img_upload.php”)
调用上载值(@Part(“value1”)字符串值1、@Part(“value2”)字符串值2、@Part(“fileToUpload1\”文件名=\“image\”)请求体文件1、@Part(“fileToUpload2\”文件名=“image\”)请求体文件2);
}
@部分(“fileToUpload1\”文件名=“image\”)请求主体文件1

服务器希望该文件具有变量名
fileToUpload1
fileToUpload2
,必须与上述格式的文件名一起发布。您也可以在此处参考解决方案


这样做,您就可以开始了:)

是的,我本来会使用您的解决方案,但是
改型2.0.0-beta2中的
TypedFile
已经被删除了,文件名是否需要扩展名
.png
?因为这正是我发布文件时应该使用的php变量名。Hmmm我不这么认为,为什么不先尝试一下呢?:)有没有这些解决方案对你有效?你能在这里发布你的解决方案吗?@Rakesh:不。没有一个对我有效。最后使用了改进版1.9,它可以顺利上传图像。这解决了我的问题。我发布的文件名是错误的。比x更能纠正我的语法!!
 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();
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);
}