#-*- coding:utf-8 -*-
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
from django.conf import settings
from datetime import *
import os, codecs
import json
import random
import re
config_path = os.path.join(os.path.dirname(__file__), "ueconfig.json")
base_dir = settings.BASE_DIR #项目的根目录
#本地上传图片时构造json返回值
class JsonResult(object):
def __init__(self,state="未知错误",url="",title="",original="",error="null"):
super(JsonResult,self).__init__()
self.state = state
self.url = url
self.title = title
self.original = original
self.error = error
#构造返回json
def buildJsonResult(result):
jsondata = {"state":result.state,"url":result.url,"title":result.title,"original":result.original,"error":result.error}
return json.dumps(jsondata)
def buildFileName(pathformat, filename):
"""
PathFormat处理
"""
dt = datetime.now()
name,ext = os.path.splitext(filename)
#创建替换字典
keys = ['{filename}', '{time}', '{yyyy}', '{yy}', '{mm}', '{dd}', '{hh}', '{ii}', '{ss}', ]
values = [name, '%H%M%S', '%Y', '%y', '%m', '%d', '%H', '%M', '%S', ]
texts = dict(zip(keys, values))
#遍历对应替换
format_text = pathformat
for key, value in texts.iteritems():
format_text = format_text.replace(key, value)
#处理随机数
regstr = r'{rand:(\d+?)}'
ms = re.search(regstr, format_text)
group = ms.group()
if group:
rand_length = int(ms.groups()[0]) #获取随机数字的长度
rand_number = random.randint(1, 10**rand_length -1) #生成随机数
rand_number = str(rand_number).zfill(rand_length) #不足位数补0
format_text = format_text.replace(group, rand_number)
return dt.strftime(format_text) + ext
#读取json文件
def getConfigContent():
jsonfile = file(config_path)
content = json.load(jsonfile)
return content
#上传配置类
class UploadConfig(object):
def __init__(self,PathFormat,UploadFieldName,SizeLimit,AllowExtensions,SavePath,Base64,Base64Filename):
super(UploadConfig,self).__init__()
self.PathFormat = PathFormat
self.UploadFieldName = UploadFieldName
self.SizeLimit = SizeLimit
self.AllowExtensions = AllowExtensions
self.SavePath = SavePath
self.Base64 = Base64
self.Base64Filename = Base64Filename
#获取json配置中的某属性值
def GetConfigValue(key):
config = getConfigContent()
return config[key]
#检查文件扩展名是否在允许的扩展名内
def CheckFileType(filename,AllowExtensions):
exts = list(AllowExtensions)
name,ext = os.path.splitext(filename)
return ext in exts
def CheckFileSize(filesize,SizeLimit):
return filesize<SizeLimit
#处理上传图片、文件、视频文件
@csrf_exempt
def uploadFile(request,config):
result = JsonResult()
if config.Base64:
pass
else:
buf = request.FILES.get(config.UploadFieldName)
filename = buf.name
if not CheckFileType(filename,config.AllowExtensions):
result.error =u"不允许的文件格式"
return HttpResponse(buildJsonResult(result))
if not CheckFileSize(buf.size,config.SizeLimit):
result.error = u"文件大小超出服务器限制"
return HttpResponse(buildJsonResult(result))
try:
truelyName = buildFileName(config.PathFormat, filename)
webUrl = config.SavePath+ truelyName
savePath = base_dir + webUrl
#判断文件夹是否存在,不存在则创建
folder, filename = os.path.split(savePath)
if not os.path.isdir(folder):
os.makedirs(folder)
print(base_dir,savePath)
f = codecs.open(savePath,"wb")
for chunk in buf.chunks():
f.write(chunk)
f.flush()
f.close()
add_watermark(savePath) #加水印
result.state = "SUCCESS"
result.url = truelyName
result.title = truelyName
result.original = truelyName
response = HttpResponse(buildJsonResult(result))
response["Content-Type"] = "text/plain"
return response
except Exception as e:
result.error = u"网络错误"
return HttpResponse(buildJsonResult(result))
#加水印
def add_watermark(savePath):
try:
#判断是否是图片文件
if not os.path.splitext(savePath)[-1].lower() in ['.jpg', '.jpge', '.png', '.bmp']:
return
#获取配置
config = getConfigContent()
is_mark = config.get('openWaterMark', False) #是否开启加水印功能
watermark = config.get('waterMarkText', '') #水印内容
font = config.get('waterMarkFont', 'msyhbd.ttf') #字体
size = config.get('waterMarkSize', 15) #字体大小
bottom = config.get('waterMarkBottom', 45) #下边距
right = config.get('waterMarkRight', 155) #右边距
#判断是否开启了加水印功能
if not is_mark:
return
#python2.7 pillow
from PIL import Image, ImageDraw, ImageFont
#打开图片
im = Image.open(savePath).convert('RGBA')
#透明的图层,用于写文本
text_layer = Image.new('RGBA', im.size, (0,0,0,0))
draw = ImageDraw.Draw(text_layer)
#加载字体,设置大小
font_path = os.path.join(os.path.dirname(__file__), font)
fnt = ImageFont.truetype(font_path, size) #要加中文字体才能识别中文
point = (text_layer.size[0]-right, text_layer.size[1]-bottom) #位置
draw.text(point, watermark, font=fnt, fill=(255,255,255,255))
#out=Image.alpha_composite(im, text_layer)
out = Image.composite(text_layer, im, text_layer)
out.save(savePath)
out.close()
except Exception as e:
print('[error]', e.message)
#处理在线图片与在线文件
#返回的数据格式:{"state":"SUCCESS","list":[{"url":"upload/image/20140627/6353948647502438222009315.png"},{"url":"upload/image/20140627/6353948659383617789875352.png"},{"url":"upload/image/20140701/6353980733328090063690725.png"},{"url":"upload/image/20140701/6353980745691597223366891.png"},{"url":"upload/image/20140701/6353980747586705613811538.png"},{"url":"upload/image/20140701/6353980823509548151892908.png"}],"start":0,"size":20,"total":6}
def listFileManage(request,imageManagerListPath,imageManagerAllowFiles,listsize):
pstart = request.GET.get("start")
start = pstart==None and int(pstart) or 0
psize = request.GET.get("size")
size = psize==None and int(GetConfigValue(listsize)) or int(psize)
localPath = base_dir + imageManagerListPath
#2016-10-31自动创建在线管理的文件夹
if not os.path.isdir(localPath):
os.makedirs(localPath)
filelist = []
exts = list(imageManagerAllowFiles)
index = start
for imagename in os.listdir(localPath):
name,ext = os.path.splitext(imagename)
if ext in exts:
filelist.append(dict(url=imagename))
index+=1
if index-start>=size:
break
jsondata = {"state":"SUCCESS","list":filelist,"start":start,"size":size,"total":index}
return HttpResponse(json.dumps(jsondata))
#返回配置信息
def configHandler(request):
content = getConfigContent()
callback = request.GET.get("callback")
if callback:
return HttpResponse("{0}{1}".format(callback,json.dumps(content)))
return HttpResponse(json.dumps(content))
#图片上传控制
@csrf_exempt
def uploadimageHandler(request):
AllowExtensions = GetConfigValue("imageAllowFiles")
PathFormat = GetConfigValue("imagePathFormat")
SizeLimit = GetConfigValue("imageMaxSize")
程序员张小妍
- 粉丝: 1w+
- 资源: 3690
最新资源
- 工业自动化控制通讯协议库,工业自动软件必备的基本程序,该库基于以c#自主开发 包括串口通信,TCP客户端,tcp服务器端,高并发物联网接收服务器端,udp通信,can总线通信,profinet,mo
- matlab代码:一种改进的樽海鞘算法 改进的SSA算法 - 采用改进Tent映射进行种群初始化 - 领导者位置更新阶段,采用自适应权重因子和Levy飞行策略 - 追随者位置更新阶段,采用非均匀高斯变
- BLDC无刷直流电机仿真设计 simulink转速 电流双闭环调速系统matlab simulink仿真有整理好的文档,资料很详细,可以直接用,有参考资料
- 隧洞开挖流固耦合模型 采用COMSOL多物理场建模,渗透系数与渗透率均为应力的函数 通过平衡地应力求出初始平衡状态,再在此基础上求解开挖后的土体变形和应力分布情况 本案例有参考文献
- 基于51单片机的温度控制器 根据设定的温度阈值,控制两个继电器开关 温度高,制冷,温度低,加热 ds18b20采集温度,adc0832对温度阈值调节上下限 lcd1602显示 提供protue
- C#Winform开源一个can上位机源码,工控试验源码,通讯源码 can接口用的周立功的dll文件 绘图用的zedgrah 上位机功能是读取历史转速数据,作为控制的目标转速,通过can卡,发送
- Labview和西门子PLC smart200 OPC通讯仪器串口通讯 全套项目资料,包括Labview 程序,研华工控机,西门子Smart 200程序,电气原理图,元器件拿后清单,详细注释 Labv
- matlab程序:以经济型与稳定性为目标的,双层微电网能量优化管理系统 主要内容:微电网中包含风电、光伏、负荷、混合储能 第一层优化以考虑实时电价的经济性为目标,滚动优化求解微电网与大电网交功率以及
- Matlab基于光流场的交通汽车检测跟踪 光流:是空间运动物体在观察成像平面上的像素运动的瞬时速度 光流法:是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对
- 单相可控整流器的完整C代码+仿真模型,基于二阶广义积分器(SOGI)进行电网电压的锁相,四象限整流器: 1. 电压外环,电流内环,双闭环dq解耦控制,加前馈补偿,响应速度快,控制精度高,抗负载扰动性能
- 车队控制纵向跟随-CarSim联合simulink仿真 自车和前车保持车速一致,车间距保持不变 可调整纵向车速、车间距 可自主设置多车辆、多车道 资料内包含.cpar文件、.slx文件,以及cpar文
- 非对称纳什谈判多微网电能共享 程序语言:matlab+yalmip 内容:构建了包含电热气多能协同的微电网模型,考虑了含有碳配额和碳交易的优化运行机制,并在热电联产机组模型中改进加入了碳捕集系统和电转
- 双碳目标下综合能源系统低碳运行优化调度Matlab程序(用Matlab+Yalmip+Cplex) 原创改进 分时优化机制+碳交易+双层需求响应优化+综合能源系统IES联合低碳优化调度:采用四个场景控
- Simulink Carsim联合仿真,基于pid,mpc自适应巡航控制,定速巡航,紧急避撞等 包括以下指导: (1)Carsim参数设置cpar文件 (2)matlab代码s函数 (3)Simul
- 利用秃鹰搜索算法BES优化极限学习机ELM的权值和阈值,基于MSE误差的适应度函数,建立多输入单输出的拟合预测模型,可以出真实值和预测值对比图,以及优化迭代图,预测值和真实值误差图,线性拟合预测图,可
- matlab simulink 风机短路故障分析,低压穿越,双馈风机短路,MPPT控制,双闭环控制,离散模型,相量模型 低电压穿越能力是当电力系统中风电装机容量比例较大时,电力系统故障导致电压跌落后
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈