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

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

//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'
        }))
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 模板标签除了几个常用的,还真心没有仔细了解一下,看到2.0发布后,翻译学习一下。 本文尽量忠实原著,毕竟大神的东西...
    海明_fd17阅读 2,074评论 0 5
  • 不支持上传文件,所以就复制过来了。作者信息什么的都没删。对前端基本属于一窍不通,所以没有任何修改,反正用着没问题就...
    全栈在路上阅读 2,018评论 0 2
  • 青涩的年华里分出很多条路, 我在心里很想踩出一条新路, 我久久伫立在路口犹豫不决, 很多人涌向川流不息的大路, 那...
    山泉_0142阅读 228评论 0 0
  • 燕国是周室王朝的嫡系诸侯国又世代镇守北疆。曾受过“靖北大国”称号。这是西周和平时期的荣耀。 在战国时代...
    秦曲昭昭阅读 143评论 0 0
  • 早餐:一杯高钙奶粉,一个白煮蛋,一个西红柿,四分之一块家常饼夹咸菜 午餐:军训提供盒饭午餐(木须肉、土豆片、圆白菜...
    春天和海燕阅读 302评论 0 0