Java 改型2-将图像上载到服务器在android studio中给出一个内部服务器错误作为响应

Java 改型2-将图像上载到服务器在android studio中给出一个内部服务器错误作为响应,java,android,node.js,retrofit,retrofit2,Java,Android,Node.js,Retrofit,Retrofit2,我正在尝试将图像文件从android应用程序发送到后端服务器。在邮递员上,发送图像并接收响应代码:200 然而,尝试使用改型从我的android应用程序发送图像时,我一直收到响应代码:500内部服务器错误。这是我的密码: public interface RetrofitInterface { @Multipart @POST("uploads/addImage") Call<ResponseBody> uploadImage(@Part MultipartB

我正在尝试将图像文件从android应用程序发送到后端服务器。在邮递员上,发送图像并接收响应代码:200

然而,尝试使用改型从我的android应用程序发送图像时,我一直收到响应代码:500内部服务器错误。这是我的密码:

public interface RetrofitInterface {
    @Multipart
    @POST("uploads/addImage")
    Call<ResponseBody> uploadImage(@Part MultipartBody.Part image);
}
然后是电话

private void uploadImage(Uri imageUri){

        File file = new File(imageUri.toString());

        RequestBody requestBody = RequestBody.create(MediaType.parse("image/*"), file);
        MultipartBody.Part body = MultipartBody.Part.createFormData("file", "image.jpg", requestBody);

        Retrofit retrofit = NetworkClient.getRetrofit();
        RetrofitInterface retrofitInterface = retrofit.create(RetrofitInterface.class);

        Call<ResponseBody> call = retrofitInterface.uploadImage(body);
        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                if(response.isSuccessful()){
                    Log.d("UploadImage", "Yeepee!!! = "+response.message());
                }else Log.d("UploadImage", "Response failure = "+response.message());
            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
                if (t instanceof SocketTimeoutException) {
                    // "Connection Timeout";
                    Log.e("UploadImage", "Connection Timeout");
                } else if (t instanceof IOException) {
                    // "Timeout";
                    Log.e("UploadImage", "Timeout");
                } else {
                    //Call was cancelled by user
                    if(call.isCanceled()) {
                        Log.e("UploadImage", "Call was cancelled forcefully");
                    } else {
                        //Generic error handling
                        Log.e("UploadImage", "Network Error :: " + t.getLocalizedMessage());
                    }
                }
            }
        });
}
private void uploadImage(Uri-imageUri){
File File=新文件(imageUri.toString());
RequestBody RequestBody=RequestBody.create(MediaType.parse(“image/*”),文件);
MultipartBody.partbody=MultipartBody.Part.createFormData(“文件”,“image.jpg”,requestBody);
改型改型=NetworkClient.getRefundation();
RegulationInterface=Regulation.create(RegulationInterface.class);
Call Call=interface.uploadImage(body);
call.enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){
if(response.issusccessful()){
Log.d(“UploadImage”,“Yeepee!!!=”+response.message());
}else Log.d(“UploadImage”,“Response failure=“+Response.message());
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
if(SocketTimeoutException的t实例){
//“连接超时”;
Log.e(“上传映像”,“连接超时”);
}else if(IOException的t实例){
//“超时”;
Log.e(“上传图像”,“超时”);
}否则{
//用户取消了呼叫
if(调用.isCanceled()){
Log.e(“上传图像”,“强制取消呼叫”);
}否则{
//一般错误处理
Log.e(“UploadImage”,“网络错误::”+t.getLocalizedMessage());
}
}
}
});
}

我不确定这是否是一个服务器错误,因为图像上传成功从邮递员。我很困惑,我不确定我做错了什么。

一般来说,500内部服务器错误意味着服务器有问题,但如果邮递员给出了200,这意味着服务器部分正常,那么代码中就有问题

试着换一行

File file = new File(imageUri.toString()); 
对此

File file = new File(imageUri.path);

此外,还要确保您使用的密钥名称与响应密钥名称相同,根据您的邮递员屏幕截图,图像文件没有密钥。您可以像下面这样尝试吗

删除此行

    MultipartBody.Part body = MultipartBody.Part.createFormData("file", "image.jpg", requestBody);
再加上这个

MultipartBody.Part body = MultipartBody.Part.createFormData("", "image.jpg", requestBody);

谢谢大家的回复。我已经能够解决这个问题,结果是我的请求主体和服务器期望的内容之间存在冲突

在我的例子中,我发送了一个不同的mime类型(a.jpg),服务器开发人员让服务器查找.jpeg和.png

这就是我如何看到错误并解决冲突的原因

Call<ResponseBody> call = retrofitInterface.uploadImage(body);
call.enqueue(new Callback<ResponseBody>() {
    @Override
    public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
      if(response.isSuccessful()){
                    Log.d("UploadImage", "Yeepee!!! = "+response.message());
                }else {
                    Log.d("UploadImage", "Response failure = "+response.message());
                    try {
                        Log.d("UploadImage", "Response failure = "+response.errorBody().string());
                    } catch (IOException e) {
                        Log.d("UploadImage", "IOException = "+e.getMessage());
                    }
                }
    }

    @Override
    public void onFailure(Call<ResponseBody> call, Throwable t) {
                if (t instanceof SocketTimeoutException) {
                    // "Connection Timeout";
                    Log.e("UploadImage", "Connection Timeout");
                } else if (t instanceof IOException) {
                    // "Timeout";
                    Log.e("UploadImage", "Timeout");
                } else {
                    //Call was cancelled by user
                    if(call.isCanceled()) {
                        Log.e("UploadImage", "Call was cancelled forcefully");
                    } else {
                        //Generic error handling
                        Log.e("UploadImage", "Network Error :: " + t.getLocalizedMessage());
                    }
                }
            }
        });
Call Call=interface.uploadImage(body);
call.enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){
if(response.issusccessful()){
Log.d(“UploadImage”,“Yeepee!!!=”+response.message());
}否则{
Log.d(“UploadImage”,“Response failure=“+Response.message());
试一试{
Log.d(“UploadImage”,“Response failure=“+Response.errorBody().string());
}捕获(IOE异常){
Log.d(“UploadImage”,“IOException=“+e.getMessage());
}
}
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
if(SocketTimeoutException的t实例){
//“连接超时”;
Log.e(“上传映像”,“连接超时”);
}else if(IOException的t实例){
//“超时”;
Log.e(“上传图像”,“超时”);
}否则{
//用户取消了呼叫
if(调用.isCanceled()){
Log.e(“上传图像”,“强制取消呼叫”);
}否则{
//一般错误处理
Log.e(“UploadImage”,“网络错误::”+t.getLocalizedMessage());
}
}
}
});

response.errorBody().string()
从服务器收到了错误消息,我能够解决冲突。

问题是为什么它是从邮递员而不是从OP的代码中工作的。谢谢@Soumik,但是我的应用程序准确地获取了文件,因为我在发送之前在位图上显示了它。我甚至将文件转换为byte[]imageByte并尝试发送,但仍然收到相同的错误
RequestBody RequestBody=RequestBody.create(MediaType.parse(“image/*”),imageBytes);MultipartBody.partbody=MultipartBody.Part.createFormData(“image”,“image.jpg”,requestBody)您是从gallery拍摄图像还是从服务器获取图像?非常感谢@Soumik的回复,但我发现了错误。你可以查看我上面的答案,看看错误是什么。你不能用Postman将请求导出到OkHttp代码吗?或者这就是你所做的?Btw 200 OK表示一切正常,500内部服务器错误表示存在服务器端异常,如@Saumik Bhattacharjee所说。非常感谢@Dulanga的回复。但我两者都做了,服务器端似乎不需要任何密钥。
Call<ResponseBody> call = retrofitInterface.uploadImage(body);
call.enqueue(new Callback<ResponseBody>() {
    @Override
    public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
      if(response.isSuccessful()){
                    Log.d("UploadImage", "Yeepee!!! = "+response.message());
                }else {
                    Log.d("UploadImage", "Response failure = "+response.message());
                    try {
                        Log.d("UploadImage", "Response failure = "+response.errorBody().string());
                    } catch (IOException e) {
                        Log.d("UploadImage", "IOException = "+e.getMessage());
                    }
                }
    }

    @Override
    public void onFailure(Call<ResponseBody> call, Throwable t) {
                if (t instanceof SocketTimeoutException) {
                    // "Connection Timeout";
                    Log.e("UploadImage", "Connection Timeout");
                } else if (t instanceof IOException) {
                    // "Timeout";
                    Log.e("UploadImage", "Timeout");
                } else {
                    //Call was cancelled by user
                    if(call.isCanceled()) {
                        Log.e("UploadImage", "Call was cancelled forcefully");
                    } else {
                        //Generic error handling
                        Log.e("UploadImage", "Network Error :: " + t.getLocalizedMessage());
                    }
                }
            }
        });