图像上传API调用与邮递员一起工作,但为什么不使用Android应用程序



我正在尝试通过我的应用程序的 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;
}

最新更新