我正在尝试通过我的应用程序的 API 调用上传图像。但在我看来,它在邮递员中工作,但通过我的应用程序完成时却不行。我正在使用改造 2,后端代码是 PHP。请帮助我完成整个过程。
PHP代码:
case 'profileImage':
$id=$_POST['id'];
$image_name=("profile".$id.".jpg");
$upload_path=("../gm-app/assets/images/users-profile/".$image_name);
$res= mysqli_query($db,"UPDATE `users` SET `image` = ('$image_name') WHERE `userid`='".$_POST['id']."'");
if(isset($_FILES['file'])){
if(move_uploaded_file($_FILES['file']['tmp_name'], $upload_path)){
$rs['message'] = "Profile Image Updated";
$rs['stat'] = "SUCCESS";
}else{
$rs['message'] = "Profile Image not Updated";
$rs['stat'] = "FAILED";
}
}
echo json_encode($rs);die;
break;
改造电话:
File file = new File(mediaPath);
RequestBody requestBody=RequestBody.create(MediaType.parse("image/*"), file);
Retrofit retrofit=new Retrofit.Builder().
baseUrl(MyConstants.ROOT_URL).
addConverterFactory(ScalarsConverterFactory.create()).
build();
apinterface services = retrofit.create(apinterface.class);
Call<ResponseBody> call=services.postImage(requestBody,uid);
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
if (response.body()!=null)
{
try {
Toast.makeText(MyProfile.this, "Image Uploaded", Toast.LENGTH_SHORT).show();
String image = response.body().string();
Log.d(TAG, "onResponse: "+image);
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Log.d(TAG, "onFailure: "+t.getMessage());
}
});
应用程序接口:
@Multipart
@POST("services.php?apicall=profileImage")
Call<ResponseBody> postImage(@Part("file") RequestBody image, @Part("id") String id);
因为你关于多部分的代码有问题。
接口 :
@Multipart
@POST("services.php?apicall=profileImage")
Call<ResponseBody> postImage(
@Part MultipartBody.Part image,
@Part("id") RequestBody id
);
调用接口
Retrofit retrofit=new Retrofit.Builder().
baseUrl(MyConstants.ROOT_URL).
addConverterFactory(ScalarsConverterFactory.create()).
build();
apinterface services = retrofit.create(apinterface.class);
//Bikin request body
File file = new File(mediaPath);
RequestBody reqFile = RequestBody.create(MediaType.parse("image/*"), file);
MultipartBody.Part body = MultipartBody.Part.createFormData("file", file.getName(), reqFile);
RequestBody reqId = RequestBody.create(MediaType.parse("text/plain"), uid);
//Tembak APInya
services.postImage(reqfile, reqId)
.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
//tulis aksi disini
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
//tulis aksi disini
}
});
像这样更改 post 方法。
@Multipart
@POST(Urls.POST_A_QUERY)
Call<CommonResponseModel> postAQuery(@Part("treatmentDetails") RequestBody treatmentDetails,@Part MultipartBody.Part file1);
然后
File file = new File(filePath);
RequestBody requestFile = RequestBody.create(MediaType.parse(mediaType), file);
document1 = MultipartBody.Part.createFormData("report1", Utils.getEdittextData(edtFirstFileName).concat(".jpg"), requestFile);
然后在第二个参数中传递该 document1 值。
String mediaType = getActivity().getContentResolver().getType(uri);
if (mediaType == null) {
mediaType = Utils.getMimeType(filePath);
}
获取模仿函数。
public static String getMimeType(String url) {
String type = null;
String extension = MimeTypeMap.getFileExtensionFromUrl(url);
if (extension != null) {
type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
}
return type;
}