1
0
forked from mirror/MrDoc
MrDoc/app_doc/util_upload_img.py

245 lines
9.0 KiB
Python
Raw Normal View History

2019-07-21 22:08:04 +08:00
# coding:utf-8
from django.http import HttpResponse
from django.conf import settings
from django.views.decorators.csrf import csrf_exempt
from django.contrib.auth.decorators import login_required # 登录需求装饰器
import datetime,time,json,base64,os,uuid
from app_doc.models import Image,ImageGroup
from app_admin.models import SysSetting
2020-11-16 21:32:08 +08:00
import requests
2020-12-15 00:32:02 +08:00
import random
@login_required()
@csrf_exempt
def upload_ice_img(request):
##################
# 如果需要使用ice自带的多文件上传请修改ice的js文件中的附件上传部分代码如下
#
# for(var i=0;i<this.files.length;i++){
# formData.append('file_' + i, this.files[i]);
# }
# formData.append('upload_num', i);
# formData.append('upload_type', "files");
##################
try:
up_type = request.POST.get('upload_type')
up_num = request.POST.get('upload_num')
except:
up_num = -1
if up_type == "files":
# 多文件上传功能需要修改js文件
res_dic = {'length':int(up_num)}
for i in range(0,int(up_num)):
file_obj = request.FILES.get('file_' + str(i))
result = ice_save_file(file_obj,request.user)
res_dic[i] = result
else:
# 粘贴上传和单文件上传
file_obj = request.FILES.get('file[]')
result = ice_save_file(file_obj,request.user)
res_dic = {0:result,"length":1} #一个文件,直接把文件数量固定了
return HttpResponse(json.dumps(res_dic), content_type="application/json")
def ice_save_file(file_obj,user):
# 默认保留支持ice单文件上传功能可以iceEditor中开启
file_suffix = str(file_obj).split(".")[-1] # 提取图片格式
# 允许上传文件类型ice粘贴上传为blob
allow_suffix =["jpg", "jpeg", "gif", "png", "bmp", "webp","blob"]
# 判断附件格式
is_images = ["jpg", "jpeg", "gif", "png", "bmp", "webp"]
if file_suffix.lower() not in allow_suffix:
return {"error": "文件格式不允许"}
if file_suffix.lower() == 'blob':
# 粘贴上传直接默认为png就行
file_suffix = 'png'
# 接下来构造一个文件名时间和随机10位字符串构成
relative_path = upload_generation_dir()
name_time = time.strftime("%Y-%m-%d_%H%M%S_")
name_join = ""
name_rand = name_join.join(random.sample('zyxwvutsrqponmlkjihgfedcba',10) )
file_name = name_time + name_rand + "." + file_suffix
path_file = relative_path + file_name
path_file = settings.MEDIA_ROOT + path_file
#file_Url 是文件的url下发路径
file_url = settings.MEDIA_URL + relative_path + file_name
with open(path_file, 'wb') as f:
for chunk in file_obj.chunks():
f.write(chunk) # 保存文件
2020-12-15 10:19:41 +08:00
if file_suffix.lower() in is_images:
Image.objects.create(
user=user,
file_path=file_url,
file_name=file_name,
remark="iceEditor上传"
)
else :
#文件上传暂时不屏蔽如果需要正常使用此功能是需要在iceeditor中修改的mrdoc使用的是自定义脚本上传
Attachment.objects.create(
user=user,
file_path=file_url,
file_name=file_name,
file_size=str(round(len(chunk)/1024,2))+"KB"
)
return {"error":0, "name": str(file_obj),'url':file_url}
2020-12-15 00:32:02 +08:00
return {"error": "文件存储异常"}
2019-07-21 22:08:04 +08:00
@login_required()
2019-07-21 22:08:04 +08:00
@csrf_exempt
def upload_img(request):
##################
# {"success": 0, "message": "出错信息"}
# {"success": 1, "url": "图片地址"}
##################
img = request.FILES.get("editormd-image-file", None) # 编辑器上传
manage_upload = request.FILES.get('manage_upload',None) # 图片管理上传
2020-11-16 21:32:08 +08:00
try:
url_img = json.loads(request.body.decode())['url']
except:
url_img = None
2019-07-21 22:08:04 +08:00
dir_name = request.POST.get('dirname','')
base_img = request.POST.get('base',None)
2020-08-30 13:51:26 +08:00
group_id = request.POST.get('group_id',0)
if int(group_id) not in [0,-1]:
try:
group_id = ImageGroup.objects.get(id=group_id)
except:
group_id = None
else:
group_id = None
2020-11-16 21:32:08 +08:00
# 上传普通图片文件
if img:
result = img_upload(img, dir_name,request.user)
2020-11-16 21:32:08 +08:00
# 图片管理上传
elif manage_upload:
2020-08-30 13:51:26 +08:00
result = img_upload(manage_upload, dir_name, request.user, group_id=group_id)
2020-11-16 21:32:08 +08:00
# 上传base64编码图片
elif base_img:
result = base_img_upload(base_img,dir_name,request.user)
2020-11-16 21:32:08 +08:00
# 上传图片URL地址
elif url_img:
if url_img.startswith("data:image"):# 以URL形式上传的BASE64编码图片
result = base_img_upload(url_img, dir_name, request.user)
else:
result = url_img_upload(url_img,dir_name,request.user)
2019-07-21 22:08:04 +08:00
else:
result = {"success": 0, "message": "上传出错"}
2019-07-21 22:08:04 +08:00
return HttpResponse(json.dumps(result), content_type="application/json")
2020-11-16 21:32:08 +08:00
2019-07-21 22:08:04 +08:00
# 目录创建
def upload_generation_dir(dir_name=''):
today = datetime.datetime.today()
2019-07-21 22:08:04 +08:00
dir_name = dir_name + '/%d%02d/' %(today.year,today.month)
# print("dir_name:",dir_name)
2019-07-21 22:08:04 +08:00
if not os.path.exists(settings.MEDIA_ROOT + dir_name):
# print("创建目录")
2019-07-21 22:08:04 +08:00
os.makedirs(settings.MEDIA_ROOT + dir_name)
return dir_name
2020-11-16 21:32:08 +08:00
2019-07-21 22:08:04 +08:00
# 普通图片上传
2020-08-30 13:51:26 +08:00
def img_upload(files, dir_name, user, group_id=None):
# 允许上传文件类型
2019-07-21 22:08:04 +08:00
allow_suffix =["jpg", "jpeg", "gif", "png", "bmp", "webp"]
file_suffix = files.name.split(".")[-1] # 提取图片格式
# 判断图片格式
if file_suffix.lower() not in allow_suffix:
2019-07-21 22:08:04 +08:00
return {"success": 0, "message": "图片格式不正确"}
# 判断图片的大小
try:
allow_image_size = SysSetting.objects.get(types='doc', name='img_size')
allow_img_size = int(allow_image_size.value) * 1048576
except Exception as e:
# print(repr(e))
allow_img_size = 10485760
if files.size > allow_img_size:
return {"success": 0, "message": "图片大小超出{}MB".format(allow_img_size / 1048576)}
2019-07-21 22:08:04 +08:00
relative_path = upload_generation_dir(dir_name)
file_name = files.name.replace(file_suffix,'').replace('.','') + '_' +str(int(time.time())) + '.' + file_suffix
2019-07-21 22:08:04 +08:00
path_file=os.path.join(relative_path, file_name)
path_file = settings.MEDIA_ROOT + path_file
2020-03-29 20:48:02 +08:00
# print('文件路径:',path_file)
2019-07-21 22:08:04 +08:00
file_url = settings.MEDIA_URL + relative_path + file_name
2020-03-29 20:48:02 +08:00
# print("文件URL",file_url)
2019-07-21 22:08:04 +08:00
with open(path_file, 'wb') as f:
for chunk in files.chunks():
f.write(chunk) # 保存文件
Image.objects.create(
user=user,
file_path=file_url,
file_name=file_name,
remark='本地上传',
2020-08-30 13:51:26 +08:00
group = group_id,
)
2019-07-21 22:08:04 +08:00
return {"success": 1, "url": file_url,'message':'上传图片成功'}
2020-11-16 21:32:08 +08:00
2019-07-21 22:08:04 +08:00
# base64编码图片上传
def base_img_upload(files,dir_name, user):
2019-07-21 22:08:04 +08:00
files_str = files.split(';base64,')[-1] # 截取图片正文
files_base = base64.b64decode(files_str) # 进行base64编码
relative_path = upload_generation_dir(dir_name)
file_name = str(datetime.datetime.today()).replace(':', '').replace(' ', '_').split('.')[0] + '.png' # 日期时间
2019-07-21 22:08:04 +08:00
path_file = os.path.join(relative_path, file_name)
path_file = settings.MEDIA_ROOT + path_file
2020-03-29 20:48:02 +08:00
# print('文件路径:', path_file)
2019-07-21 22:08:04 +08:00
file_url = settings.MEDIA_URL + relative_path + file_name
2020-03-29 20:48:02 +08:00
# print("文件URL", file_url)
2019-07-21 22:08:04 +08:00
with open(path_file, 'wb') as f:
f.write(files_base) # 保存文件
Image.objects.create(
user = user,
file_path = file_url,
file_name=file_name,
remark = '粘贴上传',
)
2020-11-16 21:32:08 +08:00
return {"success": 1, "url": file_url, 'message': '上传图片成功'}
# url图片上传
def url_img_upload(url,dir_name,user):
relative_path = upload_generation_dir(dir_name)
file_name = str(datetime.datetime.today()).replace(':', '').replace(' ', '_').split('.')[0] + '.png' # 日期时间
path_file = os.path.join(relative_path, file_name)
path_file = settings.MEDIA_ROOT + path_file
# print('文件路径:', path_file)
file_url = settings.MEDIA_URL + relative_path + file_name
# print("文件URL", file_url)
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"
}
r = requests.get(url, headers=header, stream=True)
if r.status_code == 200:
with open(path_file, 'wb') as f:
f.write(r.content) # 保存文件
Image.objects.create(
user=user,
file_path=file_url,
file_name=file_name,
remark='粘贴上传',
)
resp_data = {
'msg': '',
'code': 0,
'data' : {
'originalURL': url,
'url': file_url
}
}
return resp_data
# return {"success": 1, "url": file_url, 'message': '上传图片成功'}