Django实战-小程序端图片上传
Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。
会发现上一节中的小程序端调用自带的选择图片上传接口,可以获取到图片的路径和图片的名字以及md5值。根据小程序助手的功能需要在服务端对图片上传接口实现上传、获取、更新、删除操作。对于这些操作同样可以用 View 类视图函数实现。
from django.views import View
一、上传图片文件
// 上传图片文件
uploadFiles: function() {
var that = this
that.setData({
newBackupedFiles: []
})
// 读取文件路径
for (var i = 0; i < this.data.needUploadFiles.length; i++) {
var filePath = this.data.needUploadFiles[i]
wx.uploadFile({
url: app.globalData.serverUrl + app.globalData.apiVersion + '/service/image',
filePath: filePath,
name: 'test',
success: function(res) {
// 取出文件的名字和 nmd5
var res = JSON.parse(res.data)
var md5 = res.data[0].md5
var name = res.data[0].name
var newImageItem = {
"md5": md5,
"name": name
}
that.downloadFile(newImageItem)
}
})
}
wx.showToast({
title: '上传成功',
})
// 把上传的列表清空
this.setData({
needUploadFiles: []
})
}
二、下载图片
// 下载图片
downloadFile: function(imgItem) {
// 通过函数的参数 imgItem,将 md5 传进来
var that = this;
wx.downloadFile({
url: app.globalData.serverUrl + app.globalData.apiVersion + '/service/image' + "?md5=" + imgItem.md5,
success: function(res) {
// 临时路径
var filepath = res.tempFilePath
// var tmpPath = imgItem.md5
var newDownloadedBackupedFiles = that.data.downloadedBackupedFiles
// 取出图片路径
imgItem.path = filepath
// 容易出错
newDownloadedBackupedFiles.unshift(imgItem)
// newDownloadedBackupedFiles.push(tmpPath)
that.setData({
downloadedBackupedFiles: newDownloadedBackupedFiles
})
console.log(newDownloadedBackupedFiles)
}
})
}
三、服务端图片上传
from django.http import FileResponse, JsonResponse
class ImageView(View, CommonResponseMixin):
def get(self, request):
return JsonResponse(data=response, safe=False)
def post(self, request):
# 获取文件
# 取出文件的 key 和 value
# 读取文件
# 指定文件路径
# 保存文件
return JsonResponse(data=response, safe=False)
def put(self, request):
return JsonResponse(data=response, safe=False)
def delete(self, request):
return JsonResponse(data=response, safe=False)
def get(self, request):
md5 = request.GET.get("md5")
imgfile = os.path.join(settings.IMAGES_DIR, md5 + '.jpg')
if os.path.exists(imgfile):
data = open(imgfile, 'rb').read()
return FileResponse(open(imgfile, "rb"), content_type="image/jpg")
else:
response = self.wrap_json_response(code=ReturnCode.RESOURCES_NOT_EXISTS)
return JsonResponse(data=response, safe=False)
def post(self, request):
# 获取文件
files = request.FILES
response = []
# 取出文件的 key 和 value
for key, value in files.items():
# 读取文件
content = value.read()
md5 = hashlib.md5(content).hexdigest()
# 指定文件路径
path = os.path.join(settings.IMAGES_DIR, md5 + '.jpg')
with open(path, 'wb') as f:
# 保存文件
f.write(content)
response.append({
"name": key,
"md5": md5
})
message = 'post method success.'
response = self.wrap_json_response(data=response, code=ReturnCode.SUCCESS, message=message)
return JsonResponse(data=response, safe=False)
def put(self, request):
message = "put method success"
response = self.wrap_json_response(message=message)
return JsonResponse(data=response, safe=False)
def delete(self, request):
md5 = request.GET.get('md5')
img_name = md5 + '.jpg'
path = os.path.join(settings.IMAGES_DIR, img_name)
if os.path.exists(path):
os.remove(path)
message = "remove success"
else:
message = "file(%s) not found." % img_name
response = self.wrap_json_response(message=message, code=ReturnCode.SUCCESS)
return JsonResponse(data=response, safe=False)