python基于http协议post图片至服务器再保存

这个是我在做项目的服务端时,用来测试接收图片的小demo。

【参考资料】

https://blog.csdn.net/xiaotuzigaga/article/details/86622136
https://www.cnblogs.com/mtcnn/p/9411682.html
注意事项1~3、注意事项4、注意事项5、json知识

0、前言

1)服务端用 django搭的框架
2)客户端的请求参数为json格式

1、服务端

django项目里的views.py文件

from django.shortcuts import render
from django.http import HttpResponse
import json
import numpy as np
import base64
import os
import sys
import cv2

def uploadInfo(request):
    if request.method == 'POST':
        req = json.loads(request.body) #将json编码的字符串再转换为python的数据结构
        name = req['name']
        img_str = req['image'] #得到unicode的字符串
        img_decode_ = img_str.encode('ascii') #从unicode变成ascii编码
        img_decode = base64.b64decode(img_decode_) #解base64编码,得图片的二进制
        img_np_ = np.frombuffer(img_decode, np.uint8)
        img = cv2.imdecode(img_np_, cv2.COLOR_RGB2BGR) #转为opencv格式

        cv2.imwrite('/Users/liu/Desktop/rtmp.jpg', img) #存储路径
        return HttpResponse('添加成功!!')
    return HttpResponse('失败')

2、客户端

在任意位置建立一个python文件

import requests
import json
import numpy as np
import cv2
import base64

def getByte(path):
    with open(path, 'rb') as f:
        img_byte = base64.b64encode(f.read()) #二进制读取后变base64编码
    img_str = img_byte.decode('ascii') #转成python的unicode
    return img_str 
    
img_str = getByte('/Users/liu/Desktop/9.jpg')

requestsss={'name':'张山', 'image':img_str}
req = json.dumps(requestsss) #字典数据结构变json(所有程序语言都认识的字符串)

res=requests.post('http://127.0.0.1:8000/upload/', data=req)
print(res.text)

3、运行

1)运行服务端

python manage.py runserver

2)运行客户端

python 文件名.py

4、注意事项

详解请看置顶的参考资料
1)decode的作用:将其他编码的字符串转换成unicode编码,如str1.decode('gb2312'),表示将gb2312编码的字符串str1转换成unicode编码。
2)encode的作用:将unicode编码转换成其他编码的字符串,如str2.encode('gb2312'),表示将unicode编码的字符串str2转换成gb2312编码。
3)unicode:字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。
4)base64:用64个字符来表示任意二进制数据的方法。
5)with open语句:帮我们自动关闭(close())对应打开的文件。当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用close()的后果是数据可能只写了一部分到磁盘,剩下的丢失了。所以用with open语句比较保险。
6)request.body:获取json字符串形式的内容

5、可能出现的报错

1):服务端报错:

Forbidden (CSRF cookie not set.)

解决办法:
修改settings.py设置文件,注释掉这一行代码:

'django.middleware.csrf.CsrfViewMiddleware',

你可能感兴趣的:(python基于http协议post图片至服务器再保存)