Java 改型2-将图像上载到服务器在android studio中给出一个内部服务器错误作为响应
我正在尝试将图像文件从android应用程序发送到后端服务器。在邮递员上,发送图像并接收响应代码:200 然而,尝试使用改型从我的android应用程序发送图像时,我一直收到响应代码:500内部服务器错误。这是我的密码: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
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());
}
}
}
});