#-*- 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")
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
Python基于Django2.0 + sqlite的网络健身俱乐部网站设计源码+数据库(高分毕设).zip 1、该资源内项目代码经过严格调试,下载即用确保可以运行! 2、该资源适合计算机相关专业(如计科、人工智能、大数据、数学、电子信息等)正在做课程设计、期末大作业和毕设项目的学生、或者相关技术学习者作为学习资料参考使用。 3、该资源包括全部源码,需要具备一定基础才能看懂并调试代码。 Python基于Django2.0 + sqlite的网络健身俱乐部网站设计源码+数据库(高分毕设).zip 1、该资源内项目代码经过严格调试,下载即用确保可以运行! 2、该资源适合计算机相关专业(如计科、人工智能、大数据、数学、电子信息等)正在做课程设计、期末大作业和毕设项目的学生、或者相关技术学习者作为学习资料参考使用。 3、该资源包括全部源码,需要具备一定基础才能看懂并调试代码。 Python基于Django2.0 + sqlite的网络健身俱乐部网站设计源码+数据库(高分毕设).zip 1、该资源内项目代码经过严格调试,下载即用确保可以运行! 2、该资源适合计算机相关专业(如计科、人工智能、
资源推荐
资源详情
资源评论






























收起资源包目录





































































































共 1421 条
- 1
- 2
- 3
- 4
- 5
- 6
- 15
资源评论



辣椒种子
- 粉丝: 4518
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 【人工智能领域】人工智能与机器学习的区别与联系:从定义、范围到应用场景的全面解析
- 西门子S7-1200 Modbus TCP主从通讯:含程序、软件及说明书的完整解决方案
- 【人工智能领域】技术创新与应用拓展:大模型架构优化及AGI探索加速推动产业发展和社会变革
- 工业自动化领域OPC DA至MQTT协议转换的技术实现与应用
- 线性代数计算库OpenBLAS 0.3.28
- 配电网扩展规划模型:综合考虑电压约束与多种约束条件的研究及MATLAB实现
- 基于ElasticSearch构建的新闻研报互动易搜索引擎项目-集成中文分词插件与Redis热词统计功能-支持文档索引的CRUD操作和批量处理-用于金融信息检索与数据分析学习测试-.zip
- 使用目标检测框架完成麦穗检测
- FPGA纯Verilog代码实现JPG解码转RGB:从图片到显示器的全过程工程源码 JPG解码 2024版
- ANSYS桥梁建模实战教程:从零开始掌握命令流与工程应用技巧 · 有限元分析
- 适用于无 GPU 嵌入式设备的轻量快速目标检测代码
- 基于MATLAB与CPLEXGurobi平台的电力系统机组组合优化调度研究(含直流潮流约束)
- VTK用于支持Opencv VIZ模块显示3D图像
- 基于MATLAB-YALMIP-CPLEX的碳捕集电厂与需求响应的综合能源系统多时间尺度优化调度
- COMSOL EBG能带结构计算与伪模式去除的技术解析及应用
- 三相三电平维也纳整流器全C代码+仿真模型:电压外环电流内环双闭环dq解耦控制与SOGI-PLL锁相环的在线仿真 详细版
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
