在Django后台进行图片保存时,遇到无法直接把图片的二进制数据存入数据库问题。
阅读相关资料后得出如下结论
数据库后台存储图片可以分为两种:
//小程序
wx.uploadFile({
url: app.golobaData.serverUrl + app.golobaData.apiVersion + '/service/image',
filePath: that.data.needup_image.image_path, //通过选择按钮获取的图片地址
name: 'image', // key
formData: {
'image_width': that.data.needup_image.image_width,
'image_height': that.data.needup_image.image_height,
'image_type': that.data.needup_image.image_type
},
success: function (res) {
console.log(res)
},
fail(res) {
console.log(res)
},
complete(res) {
console.log(res)
}
})
方法1.把图片内容保存在服务器本地,数据库保存图片的存储路径(示例小程序端传一张图片)
'''服务器'''
'''获取POST到服务器的文件对象'''
def img(request)
if request.method == "POST":
files = request.FILES
'''
需要通过小程序端的key(image)获取二进制数据
获取文件内容
'''
content = files.get('image',None).read();
'''
设置保存路径
settings.IMAGES_DIR 已经默认设定
默认保存文件名字为aaa.jpg
'''
path = os.path.join(settings.IMAGES_DIR,'aaa.jpg')
with open(path,'wb') as f:
f.write(content) '''保存图片到本地'''
方法2:把图片内容直接保存到数据库的BLOB
'''服务器'''
'''获取POST到服务器的文件对象'''
def img(request)
if request.method == "POST":
files = request.FILES
'''数据库model模型类初始化'''
save_image = Businessdetail()
'''
通过key获取文件二进制内容,并读取给数据库
businessdetail_image_data = models.BinaryField(db_column='image_data')
需要通过小程序端的key(image)获取二进制数据
'''
save_image.businessdetail_image_data = files.get('image',None).read();
''' 保存图片文件到数据库'''
save_image.save()
知识点:
HttpRequest.FILES
返回一个包含了所有的上传文件的 QueryDict 对象。通过表单所上传的所有 文件 都会保存在该属性中。
key的值是input标签中name属性的值,value的值是一个UploadedFile对象
QueryDict 是一个类似于Python中字典的一种对象,他是Python中字典的子类,所以继承了字典的所有方法
QueryDict.get(key,default=None) 返回key所对应的value,若key不存在,则返回default的值
QueryDict.update(other_dict) 更新
QueryDict.values() 列出所有的值
QueryDict.items() 列出所有的键值对,若一个key有多个值,只显示最后一个值。
QueryDict.pop(key) 删除某个键值对
QueryDict.getlist(key) 根据输入的key返回一个Python中的list
QueryDict.dict() 返回QueryDict的字典的表现形式UploadedFile 对象
UploadedFile 是类文件对象,具有以下方法和属性:
UploadedFile.read() 读取整个上传文件的数据,文件较大时慎用
UploadedFile.multiple_chunks(chunk_size=None) 判断文件是否足够大,一般为2.5M
UploadedFile.chunks(chunk_size=None) 返回一个生成器对象,当multiple_chunks()为True时,应该使用这个方法代替read()
UploadedFile.name 上传文件的名字
UploadedFile.size 上传文件的大小
UploadedFile.content_type 上传文件时的content_type报文头
UploadedFile.charset 字符集