Android改型将带有文本的图片上传到PHP服务器

Android改型将带有文本的图片上传到PHP服务器,php,android,mysqli,retrofit,retrofit2,Php,Android,Mysqli,Retrofit,Retrofit2,我正在尝试创建一个系统,在这里我可以上传个人资料信息,如姓名、电子邮件、密码和个人资料图片,用户可以从图库或相机中选择图片。我正在尝试对PHP服务器和MySQL数据库进行改造 问题是,我的代码只处理图像或纯文本名称、电子邮件、密码,我似乎无法同时处理这两种内容: 这是我的代码:接口类 @POST("addProfile.php") @FormUrlEncoded Call<ServerResponse> addProfile( @Field("name") Stri

我正在尝试创建一个系统,在这里我可以上传个人资料信息,如姓名、电子邮件、密码和个人资料图片,用户可以从图库或相机中选择图片。我正在尝试对PHP服务器和MySQL数据库进行改造

问题是,我的代码只处理图像或纯文本名称、电子邮件、密码,我似乎无法同时处理这两种内容:

这是我的代码:接口类

 @POST("addProfile.php")
@FormUrlEncoded
Call<ServerResponse> addProfile(
        @Field("name") String name,
        @Field("email") String email,
        @Field("password") String password,
        @Field("picTitle") String picTitle,
        @Part MultipartBody.Part picFile

);
uploadToPHPServer方法:

private void uploadToServer(String name, String email, String password,String picTitle) {

    File file = new File(postPath);
    RequestBody requestBody = RequestBody.create(
            MediaType.parse("*/*")
            , file);

    MultipartBody.Part fileToSend = MultipartBody.Part.createFormData("picPath", file.getName(), requestBody);
    //picTitle = file.getName();

    //making api call
    ApiConfig api = AppConfig.getClient().create(ApiConfig.class);
    Call<ServerResponse> addingProfile = api.addProfile(name, email, password, picTitle, fileToSend);

    addingProfile.enqueue(new Callback<ServerResponse>() {
        @Override
        public void onResponse(Call<ServerResponse> call, Response<ServerResponse> response) {

            if(response.isSuccessful()){

                Toast.makeText(CaptureDetails.this,"Profile upload successful.", Toast.LENGTH_LONG).show();

            }else{
                Toast.makeText(CaptureDetails.this,response.body().getMessage(),Toast.LENGTH_LONG).show();
            }

        }

        @Override
        public void onFailure(Call<ServerResponse> call, Throwable t) {
            Toast.makeText(CaptureDetails.this,t.getLocalizedMessage(),Toast.LENGTH_SHORT).show();

        }
    });


}
我得到@Part参数只能与多部分编码一起使用。部分,但如果我尝试更改,将@MultiPart注释添加到接口类中,则会出现相反的错误

我一直在关注教程,当我陷入困境时,我似乎在Stack上找不到教程或类似的问题


非常感谢您提供的任何帮助或指导。提前感谢

请尝试此代码,错误是您试图使用FormurlEncoded


谢谢,这是我整理的
private void uploadToServer(String name, String email, String password,String picTitle) {

    File file = new File(postPath);
    RequestBody requestBody = RequestBody.create(
            MediaType.parse("*/*")
            , file);

    MultipartBody.Part fileToSend = MultipartBody.Part.createFormData("picPath", file.getName(), requestBody);
    //picTitle = file.getName();

    //making api call
    ApiConfig api = AppConfig.getClient().create(ApiConfig.class);
    Call<ServerResponse> addingProfile = api.addProfile(name, email, password, picTitle, fileToSend);

    addingProfile.enqueue(new Callback<ServerResponse>() {
        @Override
        public void onResponse(Call<ServerResponse> call, Response<ServerResponse> response) {

            if(response.isSuccessful()){

                Toast.makeText(CaptureDetails.this,"Profile upload successful.", Toast.LENGTH_LONG).show();

            }else{
                Toast.makeText(CaptureDetails.this,response.body().getMessage(),Toast.LENGTH_LONG).show();
            }

        }

        @Override
        public void onFailure(Call<ServerResponse> call, Throwable t) {
            Toast.makeText(CaptureDetails.this,t.getLocalizedMessage(),Toast.LENGTH_SHORT).show();

        }
    });


}
2019-03-26 16:58:21.929 11828-11828/zw.co.vokers.vinceg.vokers E/AndroidRuntime: FATAL EXCEPTION: main
Process: zw.co.vokers.vinceg.vokers, PID: 11828
java.lang.IllegalArgumentException: @Part parameters can only be used with multipart encoding. (parameter #7)
    for method ApiConfig.addEntry
    at retrofit2.ServiceMethod$Builder.methodError(ServiceMethod.java:752)
    at retrofit2.ServiceMethod$Builder.methodError(ServiceMethod.java:743)
    at retrofit2.ServiceMethod$Builder.parameterError(ServiceMethod.java:761)
    at retrofit2.ServiceMethod$Builder.parseParameterAnnotation(ServiceMethod.java:592)
    at retrofit2.ServiceMethod$Builder.parseParameter(ServiceMethod.java:336)
    at retrofit2.ServiceMethod$Builder.build(ServiceMethod.java:204)
    at retrofit2.Retrofit.loadServiceMethod(Retrofit.java:170)
    at retrofit2.Retrofit$1.invoke(Retrofit.java:147)
    at java.lang.reflect.Proxy.invoke(Proxy.java:913)
    at $Proxy0.addEntry(Unknown Source)
    at zw.co.vokers.vinceg.vokers.activities.CaptureDetails.uploadToServer(CaptureDetails.java:578)
    at zw.co.vokers.vinceg.vokers.activities.CaptureDetails.access$400(CaptureDetails.java:78)
    at zw.co.vokers.vinceg.vokers.activities.CaptureDetails$1.onClick(CaptureDetails.java:189)
    at android.view.View.performClick(View.java:6294)
    at android.view.View$PerformClick.run(View.java:24770)
    at android.os.Handler.handleCallback(Handler.java:790)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6494)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
@POST("addProfile.php")
@Multipart
Call<ServerResponse> addProfile(
    @Part ("name") String name,
    @Part ("email") String email,
    @Part ("password") String password,
    @Part ("picTitle") String picTitle,
    @Part MultipartBody.Part picFile
);