Java 使用okhttp v3.2.0上载多个图像文件
我正在尝试使用okhttp v3.2.0上载包含多个图像的多部分数据(可以是无图像或最多4个图像),主要问题是,除图像外的所有数据都上载到服务器。我在配方页面上尝试了okhttp的源代码,我也尝试了 但没有发现任何成功。应用程序没有崩溃,没有错误。但是图像没有上传。我还使用POSTMAN检查了服务器端API,它工作正常,没有任何问题。这是我的代码,谢谢你的帮助Java 使用okhttp v3.2.0上载多个图像文件,java,android,image-uploading,multipart,okhttp,Java,Android,Image Uploading,Multipart,Okhttp,我正在尝试使用okhttp v3.2.0上载包含多个图像的多部分数据(可以是无图像或最多4个图像),主要问题是,除图像外的所有数据都上载到服务器。我在配方页面上尝试了okhttp的源代码,我也尝试了 但没有发现任何成功。应用程序没有崩溃,没有错误。但是图像没有上传。我还使用POSTMAN检查了服务器端API,它工作正常,没有任何问题。这是我的代码,谢谢你的帮助 String URL = BASE_URL + "PostRequest.php"; MediaType MEDIA_TYPE; Ca
String URL = BASE_URL + "PostRequest.php";
MediaType MEDIA_TYPE;
Calendar c = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String PostDate = sdf.format(c.getTime());
mOkHttpClient = new OkHttpClient.Builder()
.connectTimeout(20, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.readTimeout(40, TimeUnit.SECONDS)
.build();
MultipartBody.Builder mRequestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM);
mRequestBody.addFormDataPart("SECURITYCODE",SECURITY_CODE);
mRequestBody.addFormDataPart("EMAIL", Email);
mRequestBody.addFormDataPart("CATEGORY", Category);
mRequestBody.addFormDataPart("SUBCATEGORY", SubCategory);
mRequestBody.addFormDataPart("TITLE", Title);
mRequestBody.addFormDataPart("DESCRIPTION", Description);
mRequestBody.addFormDataPart("LOCATION", Location);
mRequestBody.addFormDataPart("POSTDATE", PostDate);
mRequestBody.addFormDataPart("LOCALITY", Locality);
mRequestBody.addFormDataPart("TOTALIMAGES", Imagepaths.size()+"");
if (Imagepaths.size() > 0) {
File file = new File(Imagepaths.get(0));
if (file.exists()) {
Log.d("file exist", "yes");
}
MEDIA_TYPE = Imagepaths.get(0).endsWith("png") ?
MediaType.parse("image/png") : MediaType.parse("image/jpeg");
RequestBody imageBody = RequestBody.create(MEDIA_TYPE, file);
mRequestBody.addFormDataPart("IMAGE1", "IMAGE1", imageBody);
}
if (Imagepaths.size() > 1) {
File file = new File(Imagepaths.get(1));
MEDIA_TYPE = Imagepaths.get(0).endsWith("png") ?
MediaType.parse("image/png") : MediaType.parse("image/jpeg");
RequestBody imageBody = RequestBody.create(MEDIA_TYPE, file);
mRequestBody.addFormDataPart("IMAGE2", "IMAGE2", imageBody);
}
if (Imagepaths.size() > 2) {
File file = new File(Imagepaths.get(2));
MEDIA_TYPE = Imagepaths.get(0).endsWith("png") ?
MediaType.parse("image/png") : MediaType.parse("image/jpeg");
RequestBody imageBody = RequestBody.create(MEDIA_TYPE, file);
mRequestBody.addFormDataPart("IMAGE3", "IMAGE3", imageBody);
}
if (Imagepaths.size() > 3) {
File file = new File(Imagepaths.get(3));
MEDIA_TYPE = Imagepaths.get(0).endsWith("png") ?
MediaType.parse("image/png") : MediaType.parse("image/jpeg");
RequestBody imageBody = RequestBody.create(MEDIA_TYPE, file);
mRequestBody.addFormDataPart("IMAGE4", "IMAGE4", imageBody);
}
RequestBody rb = mRequestBody.build();
Request request = new Request.Builder()
.url(URL)
.post(rb)
.build();
try {
Response mResponse = mOkHttpClient.newCall(request).execute();
if (!mResponse.isSuccessful()) throw new IOException();
responseMsg = mResponse.body().string();
} catch (IOException e) {
responseMsg = timeoutMessage;
}
return responseMsg;
首先,代码中有几个错误 检查mediatype检查位置,始终使用相同的列表元素(应为索引1、2、3等) 其次,
mRequestBody.addFormDataPart(“IMAGE2”,“IMAGE2”,imageBody)代码>
您的图像有名称IMAGE1、IMAGE2等吗?mRequestBody.addFormDataPart(“IMAGE2”、“IMAGE2”、“imageBody”);为什么要使用两个“IMAGE2”键?无关:这是在乞求for循环。@简单一点:一个是获取数据的键,另一个是文件名。这是我第一次使用多部分数据和okhttp,okhttp的配方页也使用硬编码字符串作为文件名传递。我在qus中提到的链接问题也做了同样的事情。@EugenPechanec:是的,我第一次尝试使用循环,然后认为可能是循环导致了问题,所以使用if。我知道在我脑海中的某个地方我做错了什么,这就是为什么在这种情况下会使用循环。我纠正了媒体类型的问题,但问题仍然存在。不,我的图像没有图像1,图像2。。。名称,但我所讲的其他示例都使用了硬编码字符串。另外,说实话,我不知道为什么要使用“mRequestBody.addFormDataPart(“IMAGE2”,“IMAGE2”,imageBody);”中的第二个参数。将根据表中的ID在服务器端更改图像的名称。第一个参数是服务器的键(如字典/地图中的键)。第二个参数-你需要写下你上传的文件名(比如“image_2.png”),谢谢你的帮助,这是文件名问题,我做得不对。将第二个参数替换为file.getName();它成功了。又是唐克斯。
if (Imagepaths.size() > 1) {
File file = new File(Imagepaths.get(1));
MEDIA_TYPE = Imagepaths.get(0).endsWith("png") ?
MediaType.parse("image/png") : MediaType.parse("image/jpeg");
RequestBody imageBody = RequestBody.create(MEDIA_TYPE, file);
mRequestBody.addFormDataPart("IMAGE2", "IMAGE2", imageBody);
}