我正在尝试将图片发布到服务器。这是我在脚本服务器提供给我的服务器端的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);
}
两个字符串值都会在服务器上发布,但不会在图像上发布。如果我在发布图像文件的任何地方出错,请纠正我。我是新来的改造。
答案 0 :(得分:6)
根据您的问题,服务器期望的变量是两个图像(文件)fileToUpload1
和fileToUpload2
。上传图片的原因是您在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
服务器需要具有变量名fileToUpload1
和fileToUpload2
的文件,该文件必须与上述格式的文件名一起发布。你也可以在这里引用解决方案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脚本中的检查字符串。