android 服务器500,okHttp异步上传图片到服务器得到Internal server error(500)错误的解决办法:...

本文详细介绍了在Android应用中使用OkHttp异步上传图片到Django服务器时遇到500 Internal Server Error的问题及解决方案。问题根源在于服务器端模型存储方式处理不当,通过检查模型对象是否存在来正确创建或更新头像。

这是一个巨坑,先上源码:

//Android

/**

* 上传图像到服务器

* @param img

*/

public void uploadImgToServer(File img) throws UnsupportedEncodingException {

sp = mContext.getSharedPreferences("member_log", Context.MODE_PRIVATE);

String fileName = sp.getString("username","");

String finalName = URLEncoder.encode(fileName,"utf-8");//解析中文到GBK编码

MediaType MEDIA_TYPE_JPG = MediaType.parse("application/x-www-form-urlencoded");

RequestBody requestBody = MultipartBody.create(MEDIA_TYPE_JPG,img);

// String finalName = getValueEncoded(fileName);

// 把我坑的一上午你妈的,老子一致在NetUtils

// 里面转悠,没有想到你是发送到服务器的最后一步。

MultipartBody.Builder builder = new MultipartBody.Builder()

.setType(MultipartBody.FORM)

.addFormDataPart("title","Logo")

.addFormDataPart("img",finalName+".jpg", //封装上传图片的参数

requestBody);

//ReqestBody中要携带参数

RequestBody multipartBody = builder.build();//Build a instance of RequestBody

String url = "http://192.168.1.117:8080/polls/uploadHeadImg/";

Request request = new Request.Builder()

.url(url)

// .addHeader("Accept","text/plain")

.addHeader("Accept-Charset", "UTF-8")

// .addHeader("Content-Type","application/x-www-form-urlencoded; charset=utf-8")

.post(multipartBody)

.build();

Call call = client.newCall(request);

call.enqueue(new Callback() {

@Override

public void onFailure(Call call, IOException e) {

Log.e("TAG","onFaile:" +e);

Thread thread = new Thread(() -> {

Looper.prepare();

Toast.makeText(mContext,"上传失败",Toast.LENGTH_LONG).show();

Looper.loop();

});

thread.start();

}

@Override

public void onResponse(Call call, Response response) throws IOException {

Log.e("TAG","success");

if(!response.isSuccessful()){

Thread thread = new Thread(() -> {

Looper.prepare();

Toast.makeText(mContext,"上传成功,请求失败",

Toast.LENGTH_LONG).show();

Looper.loop();

});

thread.start();

}else{

Thread thread = new Thread(() -> {

Looper.prepare();

try {

Toast.makeText(mContext,"上传成功,返回信息:"+response.body().string(),

Toast.LENGTH_LONG).show();

} catch (IOException e) {

e.printStackTrace();

}

Looper.loop();

});

thread.start();

}

}

});

}

贴出Django代码:

# Add member head portrait

@csrf_exempt

def uploadHeadImg(request):

source = request.FILES.get('img')

if source:

firstName = source.name

secondName = os.path.splitext(firstName)[0]#Double check trim the blank.

finalName = unquote(secondName)

source.name = finalName+".jpg"

member = Member.objects.get(user_name=finalName)

member.attribute_set.create(head_img=source, name=finalName, last_login_time=timezone.now())

return HttpResponse(source.name+"upload success", content_type="text/plain")

else:

return HttpResponse(source.name+"Failed", content_type="text/plain")

以上代码亲测upload server picture没有任何问题,可是奇怪的现象出现了,在onResponse中 response.code() 得到http error code 500,我找了N多个博文,大多数都是在StackOverflow上面,都说的要么很深,要么驴头不对马嘴,都没有解决。最后发现,问题出现在你的服务器上是否存在文件,如果不存在就需要用create的方式,如果存在了,注意:就一定要用我列举的第二种方式,要不然就会一直返回500如下:

改变model的存储方式需要判断,正确的代码如下:

# Add member head portrait

@csrf_exempt

def uploadHeadImg(request):

source = request.FILES.get('img')

if source:

firstName = source.name

secondName = os.path.splitext(firstName)[0]#Double check trim the blank.

finalName = unquote(secondName)

source.name = finalName+".jpg"

member = Member.objects.get(user_name=finalName)

if member.attribute_set.all().exists():#先判断查询集里面是否有模型对象如果没有说明是第一次设置头像,并不是修改头像。

attribute = member.attribute_set.get(img_name=finalName)

attribute.head_img = source

attribute.img_name = finalName

attribute.save()

else:

member.attribute_set.create(img_name=finalName, head_img=source, last_login_time=datetime.now())#第一次修改头像,就必须用这种方法

return HttpResponse(json.dumps(

{"headImg_path":"httP://127.168.1.117:8080/midea/headImg/"+source.name}

), content_type='application/json; charset=utf-8')

else:

return HttpResponse(json.dumps({

'error_code':100,

'result':'request_error'

}))

I/PCLog_: [com.naz.label.util.ActivityLifecycleUtils$FLC.onFragmentPaused(ActivityLifecycleUtils.java:178)] f-->ReaderCfgFragment{9c646c5} (d088ffd2-e5cc-4038-b466-a21015651526) id=0xffffffff} I/PCLog_: [com.naz.label.util.ActivityLifecycleUtils$FLC.onFragmentViewDestroyed(ActivityLifecycleUtils.java:186)] f-->ReaderCfgFragment{9c646c5} (d088ffd2-e5cc-4038-b466-a21015651526) id=0xffffffff} I/PCLog_: [com.naz.label.util.ActivityLifecycleUtils$FLC.onFragmentPaused(ActivityLifecycleUtils.java:178)] f-->SelectTagFragment{3903f2f} (68ef1e25-34ae-410b-bf3c-1c3b56b6fccb) id=0xffffffff} I/PCLog_: [com.naz.label.util.ActivityLifecycleUtils$FLC.onFragmentViewDestroyed(ActivityLifecycleUtils.java:186)] f-->SelectTagFragment{3903f2f} (68ef1e25-34ae-410b-bf3c-1c3b56b6fccb) id=0xffffffff} W/m.uhf.rfid.deme: Accessing hidden method Ldalvik/system/CloseGuard;->get()Ldalvik/system/CloseGuard; (unsupported,core-platform-api, reflection, allowed) Accessing hidden method Ldalvik/system/CloseGuard;->open(Ljava/lang/String;)V (unsupported,core-platform-api, reflection, allowed) Accessing hidden method Ldalvik/system/CloseGuard;->warnIfOpen()V (unsupported,core-platform-api, reflection, allowed) D/CompatibilityChangeReporter: Compat change id reported: 247079863; UID 10123; state: DISABLED D/TrafficStats: tagSocket(103) with statsTag=0xffffffff, statsUid=-1 W/m.uhf.rfid.deme: Accessing hidden method Lcom/android/org/conscrypt/ConscryptEngineSocket;->setUseSessionTickets(Z)V (max-target-q,core-platform-api, reflection, allowed) W/m.uhf.rfid.deme: Accessing hidden method Lcom/android/org/conscrypt/ConscryptEngineSocket;->setHostname(Ljava/lang/String;)V (max-target-q,core-platform-api, reflection, allowed) Accessing hidden method Lcom/android/org/conscrypt/OpenSSLSocketImpl;->setAlpnProtocols([B)V (max-target-q,core-platform-api, reflection, allowed) W/m.uhf.rfid.deme: Accessing hidden method Lcom/android/org/conscrypt/OpenSSLSocketImpl;->getAlpnSelectedProtocol()[B (max-target-q,core-platform-api, reflection, allowed) W/m.uhf.rfid.deme: Got a deoptimization request on un-deoptimizable method java.lang.Object java.lang.Class.newInstance() W/m.uhf.rfid.deme: Got a deoptimization request on un-deoptimizable method java.net.InetAddress[] libcore.io.Linux.android_getaddrinfo(java.lang.String, android.system.StructAddrinfo, int) D/AndroidRuntime: Shutting down VM E/AndroidRuntime: FATAL EXCEPTION: main Process: com.uhf.rfid.deme, PID: 24085 android.os.NetworkOnMainThreadException at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1675) at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:115) at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:103) at java.net.InetAddress.getAllByName(InetAddress.java:1152) at com.android.okhttp.Dns$1.lookup(Dns.java:41) at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:178) at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:144) at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:86) at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:176) at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:128) at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:97) at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:289) at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:232) at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:465) at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:411) at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:542) at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getResponseCode(DelegatingHttpsURLConnection.java:106) at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:30) at com.naz.label.fragments.home.cow.CowFragment.onViewCreated(CowFragment.java:67) at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:322) at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1185) at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1354) at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1432) at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1495) at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:447) at androidx.fragment.app.FragmentManager.executeOps(FragmentManager.java:2167) at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1990) at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1945) at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1847) at androidx.fragment.app.FragmentManager$4.run(FragmentManager.java:413) at android.os.Handler.handleCallback(Handler.java:1003) at android.os.Handler.dispatchMessage(Handler.java:108) at android.os.Looper.loopOnce(Looper.java:205) at android.os.Looper.loop(Looper.java:294) at android.app.ActivityThread.main(ActivityThread.java:8214) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1187) E/PCLog_: catchInfo-------------> [com.naz.label.ErrorReport.handleException(ErrorReport.java:51)] android.os.NetworkOnMainThreadException at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1675) at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:115) at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:103) at java.net.InetAddress.getAllByName(InetAddress.java:1152) at com.android.okhttp.Dns$1.lookup(Dns.java:41) at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:178) at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:144) at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:86) at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:176) at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:128) at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:97) at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:289) at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:232) at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:465) at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:411) at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:542) at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getResponseCode(DelegatingHttpsURLConnection.java:106) at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:30) at com.naz.label.fragments.home.cow.CowFragment.onViewCreated(CowFragment.java:67) at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:322) at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1185) at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1354) at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1432) at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1495) at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:447) at androidx.fragment.app.FragmentManager.executeOps(FragmentManager.java:2167) at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1990) at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1945) at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1847) at androidx.fragment.app.FragmentManager$4.run(FragmentManager.java:413) at android.os.Handler.handleCallback(Handler.java:1003) at android.os.Handler.dispatchMessage(Handler.java:108) at android.os.Looper.loopOnce(Looper.java:205) at android.os.Looper.loop(Looper.java:294) at android.app.ActivityThread.main(ActivityThread.java:8214) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1187) D/module_manager: Opening value = 0 devNo = 0 D/module_manager: Open success! fd = 112--1 type = 1-0 ret = 1 D/serial_port: close(fd = 113) I/m.uhf.rfid.deme: type=1400 audit(0.0:7570): avc: denied { ioctl } for path="/dev/rfid" dev="tmpfs" ino=651 ioctlcmd=0xf402 scontext=u:r:untrusted_app_27:s0:c123,c256,c512,c768 tcontext=u:object_r:device:s0 tclass=chr_file permissive=1 app=com.uhf.rfid.deme I/PCLog_: [com.naz.label.util.ActivityLifecycleUtils.finishAll(ActivityLifecycleUtils.java:76)] finishAll->[] I/m.uhf.rfid.deme: System.exit called, status: 0 I/AndroidRuntime: VM exiting with result code 0, cleanup skipped. Disconnected from the target VM, address: 'localhost:56646', transport: 'socket' 这个报错代码是在执行到int responseCode = connection.getResponseCode();这句代码发生的,请问这是怎么回事,怎么处理
09-27
08-21 18:07:20.466 7164 12940 E AndroidRuntime: FATAL EXCEPTION: OkHttp Dispatcher 08-21 18:07:20.466 7164 12940 E AndroidRuntime: Process: com.huawei.ivi.radio, PID: 7164 08-21 18:07:20.466 7164 12940 E AndroidRuntime: java.lang.NullPointerException: Attempt to invoke interface method 'java.util.Iterator java.util.List.iterator()' on a null object reference 08-21 18:07:20.466 7164 12940 E AndroidRuntime: at cv$a.onResponse(CategoryTree.java:54) 08-21 18:07:20.466 7164 12940 E AndroidRuntime: at okhttp3.RealCall$AsyncCall.execute(RealCall.java:37) 08-21 18:07:20.466 7164 12940 E AndroidRuntime: at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:18) 08-21 18:07:20.466 7164 12940 E AndroidRuntime: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 08-21 18:07:20.466 7164 12940 E AndroidRuntime: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 08-21 18:07:20.466 7164 12940 E AndroidRuntime: at java.lang.Thread.run(Thread.java:933) 08-21 18:07:20.469 2003 2068 E 01810/FmpSrv: Find: system_app_crash@1755770840468.txt, mask: 8 08-21 18:07:20.468 7164 12941 E AndroidRuntime: FATAL EXCEPTION: OkHttp Dispatcher 08-21 18:07:20.468 7164 12941 E AndroidRuntime: Process: com.huawei.ivi.radio, PID: 7164 08-21 18:07:20.468 7164 12941 E AndroidRuntime: java.lang.NullPointerException: Attempt to invoke interface method 'java.util.Iterator java.util.List.iterator()' on a null object reference 08-21 18:07:20.468 7164 12941 E AndroidRuntime: at cv$a.onResponse(CategoryTree.java:54) 08-21 18:07:20.468 7164 12941 E AndroidRuntime: at okhttp3.RealCall$AsyncCall.execute(RealCall.java:37) 08-21 18:07:20.468 7164 12941 E AndroidRuntime: at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:18) 08-21 18:07:20.468 7164 12941 E AndroidRuntime: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 08-21 18:07:20.468 7164 12941 E AndroidRuntime: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 08-21 18:07:20.468 7164 12941 E AndroidRuntime: at java.lang.Thread.run(Thread.java:933)
08-22
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值