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
|
2020-03-21 16:11:21 +08:00
|
|
|
|
from django.contrib.auth.decorators import login_required # 登录需求装饰器
|
|
|
|
|
import datetime,time,json,base64,os,uuid
|
|
|
|
|
from app_doc.models import Image,ImageGroup
|
2020-09-26 21:27:06 +08:00
|
|
|
|
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
|
|
|
|
|
2020-03-21 16:11:21 +08:00
|
|
|
|
@login_required()
|
2019-07-21 22:08:04 +08:00
|
|
|
|
@csrf_exempt
|
|
|
|
|
def upload_img(request):
|
|
|
|
|
##################
|
|
|
|
|
# {"success": 0, "message": "出错信息"}
|
|
|
|
|
# {"success": 1, "url": "图片地址"}
|
|
|
|
|
##################
|
2020-03-21 16:11:21 +08:00
|
|
|
|
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:
|
2020-03-21 16:11:21 +08:00
|
|
|
|
result = img_upload(img, dir_name,request.user)
|
2020-11-16 21:32:08 +08:00
|
|
|
|
# 图片管理上传
|
2020-03-21 16:11:21 +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:
|
2020-03-21 16:11:21 +08:00
|
|
|
|
result = base_img_upload(base_img,dir_name,request.user)
|
2020-11-16 21:32:08 +08:00
|
|
|
|
# 上传图片URL地址
|
|
|
|
|
elif url_img:
|
2020-12-13 15:43:59 +08:00
|
|
|
|
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:
|
2020-09-26 21:27:06 +08:00
|
|
|
|
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=''):
|
2020-03-21 16:11:21 +08:00
|
|
|
|
today = datetime.datetime.today()
|
2019-07-21 22:08:04 +08:00
|
|
|
|
dir_name = dir_name + '/%d%02d/' %(today.year,today.month)
|
2020-03-21 16:11:21 +08:00
|
|
|
|
# print("dir_name:",dir_name)
|
2019-07-21 22:08:04 +08:00
|
|
|
|
if not os.path.exists(settings.MEDIA_ROOT + dir_name):
|
2020-03-21 16:11:21 +08:00
|
|
|
|
# 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):
|
2020-09-26 21:27:06 +08:00
|
|
|
|
# 允许上传文件类型
|
2019-07-21 22:08:04 +08:00
|
|
|
|
allow_suffix =["jpg", "jpeg", "gif", "png", "bmp", "webp"]
|
2020-03-21 16:11:21 +08:00
|
|
|
|
file_suffix = files.name.split(".")[-1] # 提取图片格式
|
|
|
|
|
# 判断图片格式
|
2020-06-03 21:09:02 +08:00
|
|
|
|
if file_suffix.lower() not in allow_suffix:
|
2019-07-21 22:08:04 +08:00
|
|
|
|
return {"success": 0, "message": "图片格式不正确"}
|
2020-03-21 16:11:21 +08:00
|
|
|
|
|
2020-09-26 21:27:06 +08:00
|
|
|
|
# 判断图片的大小
|
|
|
|
|
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)
|
2020-03-21 16:11:21 +08:00
|
|
|
|
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) # 保存文件
|
2020-03-21 16:11:21 +08:00
|
|
|
|
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,
|
2020-03-21 16:11:21 +08:00
|
|
|
|
)
|
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编码图片上传
|
2020-03-21 16:11:21 +08:00
|
|
|
|
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)
|
2020-03-21 16:11:21 +08:00
|
|
|
|
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) # 保存文件
|
2020-03-21 16:11:21 +08:00
|
|
|
|
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': '上传图片成功'}
|