Php 改进v2.0.0-beta2如何使用RequestBody上传文件
我正在尝试将图像发布到服务器。以下是scriptor提供给我的服务器端php变量名: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 这是我
$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);
}