You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
197 lines
8.4 KiB
197 lines
8.4 KiB
import logging
|
|
import os
|
|
import traceback
|
|
import uuid
|
|
import time
|
|
import datetime
|
|
from urllib import parse
|
|
|
|
from django.http import FileResponse
|
|
from rest_framework import status
|
|
from rest_framework.permissions import IsAuthenticated
|
|
from rest_framework.views import APIView
|
|
from rest_framework_jwt.authentication import JSONWebTokenAuthentication
|
|
|
|
from ChaCeRndTrans import settings
|
|
from ChaCeRndTrans.basic import CCAIResponse
|
|
from ChaCeRndTrans.code import SERVER_ERROR, PARAMS_ERR
|
|
from utils.custom import RbacPermission, create_operation_history_log, generate_random_str
|
|
from common.models import OperationHistoryLog
|
|
|
|
logger = logging.getLogger('error')
|
|
|
|
class UploadFileAPIView(APIView):
|
|
'''
|
|
上传附件
|
|
'''
|
|
authentication_classes = (JSONWebTokenAuthentication,)
|
|
permission_classes = (IsAuthenticated,)
|
|
|
|
def post(self, request, *args, **kwargs):
|
|
upload_file = request.FILES.get("file", None)
|
|
file_type = request.data.get("file_type", None)
|
|
try:
|
|
if not upload_file or not file_type:
|
|
return CCAIResponse(msg="上传失败", status=status.HTTP_400_BAD_REQUEST)
|
|
if upload_file.size > settings.MAX_FILE_SIZE:
|
|
return CCAIResponse(msg="上传文件需小于或等于10M", status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
# 上传的是学员模板
|
|
# if file_type == "template-xlsx" or file_type == "template-xls":
|
|
# name = os.path.splitext(upload_file.name)[0]
|
|
# ext = os.path.splitext(upload_file.name)[-1]
|
|
# file_name = name + generate_random_str(3) + ext
|
|
# path_1, path_2 = file_type.split("-")
|
|
# # 本地存储目录
|
|
# save_path = os.path.join(settings.FILE_PATH, path_1, path_2)
|
|
# save_path = save_path.replace('\\', '/')
|
|
# # 如果不存在则创建目录
|
|
# if not os.path.exists(save_path):
|
|
# os.makedirs(save_path)
|
|
# files = os.listdir(save_path) # 查找路径下的所有的文件夹及文件
|
|
# if path_2 == "xlsx":
|
|
# n_path = os.path.join(settings.FILE_PATH, path_1, "xls")
|
|
# if os.path.exists(n_path):
|
|
# files2 = os.listdir(n_path) # 查找路径下的所有的文件夹及文件
|
|
# else:
|
|
# files2 = []
|
|
# else:
|
|
# n_path = os.path.join(settings.FILE_PATH, path_1, "xlsx")
|
|
# if os.path.exists(n_path):
|
|
# files2 = os.listdir(n_path) # 查找路径下的所有的文件夹及文件
|
|
# else:
|
|
# files2 = []
|
|
# file_path = open(save_path + "/" + file_name, 'wb')
|
|
# for chunk in upload_file.chunks():
|
|
# file_path.write(chunk)
|
|
# file_path.close()
|
|
# # 删除曾经的旧模板
|
|
# if len(files) > 0:
|
|
# for each in files:
|
|
# # 删除文件
|
|
# os.remove(save_path + "/" + each)
|
|
# if len(files2) > 0:
|
|
# for each in files:
|
|
# # 删除文件
|
|
# os.remove(save_path + "/" + each)
|
|
# # 操作记录
|
|
# # info = {
|
|
# # "des": "上传模板",
|
|
# # "detail": "后端存储路径: " + save_path + "/" + file_name
|
|
# # }
|
|
# # create_operation_history_log(request, info, OperationHistoryLog)
|
|
# return CCAIResponse("success", status=status.HTTP_200_OK)
|
|
|
|
# 文件名进行url编码
|
|
# file_name = parse.quote(upload_file.name)
|
|
file_name = upload_file.name
|
|
name = os.path.splitext(upload_file.name)[0]
|
|
ext = os.path.splitext(upload_file.name)[-1]
|
|
ct = time.time() # 取得系统时间
|
|
local_time = time.localtime(ct)
|
|
date_head = time.strftime("%Y%m%d%H%M%S", local_time) # 格式化时间
|
|
date_m_secs = str(datetime.datetime.now().timestamp()).split(".")[-1] # 毫秒级时间戳
|
|
time_stamp = "%s%.3s" % (date_head, date_m_secs) # 拼接时间字符串
|
|
# print(time_stamp)
|
|
# 本地存储目录
|
|
save_path = os.path.join(settings.FILE_PATH, file_type)
|
|
save_path = save_path.replace('\\', '/')
|
|
# save_path = os.path.join(settings.FILE_PATH, file_type)
|
|
# 前端显示目录
|
|
start = file_name.rindex('.')
|
|
# name = file_name[0: start]
|
|
# type = file_name[start:]
|
|
show_path = os.path.join(settings.SHOW_UPLOAD_PATH, file_type, time_stamp + ext)
|
|
show_path = show_path.replace('\\', '/')
|
|
# 如果不存在则创建目录
|
|
if not os.path.exists(save_path):
|
|
os.makedirs(save_path)
|
|
|
|
file_path = open(save_path + '/' + time_stamp + ext, 'wb')
|
|
for chunk in upload_file.chunks():
|
|
file_path.write(chunk)
|
|
file_path.close()
|
|
|
|
# 操作记录
|
|
# info = {
|
|
# "des": "上传附件",
|
|
# "detail": "后端存储路径: " + save_path + "/" + file_name + ", 前端显示路径: " + show_path
|
|
# }
|
|
# create_operation_history_log(request, info, OperationHistoryLog)
|
|
return CCAIResponse(show_path)
|
|
except Exception as e:
|
|
logger.error("upload file failed: \n%s" % traceback.format_exc())
|
|
return CCAIResponse("上传失败", SERVER_ERROR)
|
|
|
|
class DeleteFileAPIView(APIView):
|
|
'''
|
|
删除附件
|
|
'''
|
|
def post(self, request, *args, **kwargs):
|
|
|
|
tempdict = request.data.copy()
|
|
if 'upload_url' not in tempdict and tempdict['upload_url'] == '':
|
|
return CCAIResponse("upload_url参数不能为空!", status=status.HTTP_400_BAD_REQUEST)
|
|
upload_url = tempdict['upload_url'].replace(settings.SHOW_UPLOAD_PATH, settings.FILE_PATH)
|
|
start = upload_url.rindex('/')
|
|
# name_start = upload_url.rindex('_')
|
|
# type_start = upload_url.rindex('.')
|
|
#拼接本地文件路劲
|
|
# local_path = upload_url[0: start] + '/' + upload_url[name_start+1: type_start]
|
|
# local_url = local_path + upload_url[start: name_start] + upload_url[type_start:]
|
|
local_path = upload_url[0: start + 1]
|
|
import os
|
|
if os.path.exists(upload_url): # 如果文件存在
|
|
# 删除文件,可使用以下两种方法。
|
|
os.remove(upload_url)
|
|
# 删除空目录,不是空目录时候rmdir不会删除
|
|
try:
|
|
os.rmdir(local_path)
|
|
except Exception as e:
|
|
logger.error("rmdir failed: \n%s" % traceback.format_exc())
|
|
|
|
# 操作记录
|
|
# info = {
|
|
# "des": "删除附件",
|
|
# "detail": "后端存储路径: " + local_path
|
|
# }
|
|
# create_operation_history_log(request, info, OperationHistoryLog)
|
|
return CCAIResponse("success")
|
|
else:
|
|
return CCAIResponse("文件不存在")
|
|
|
|
class DownLoadFileAPIView(APIView):
|
|
'''
|
|
下载附件
|
|
'''
|
|
authentication_classes = (JSONWebTokenAuthentication,)
|
|
permission_classes = (IsAuthenticated,)
|
|
|
|
def post(self, request, *args, **kwargs):
|
|
download_file = request.data.get("ccw_file_path")
|
|
try:
|
|
if download_file is None or download_file == "":
|
|
return CCAIResponse(PARAMS_ERR, SERVER_ERROR)
|
|
|
|
re_file = download_file.replace('/upload/file/', settings.FILE_PATH)
|
|
file = open(re_file, 'rb')
|
|
# url解码
|
|
file_name = parse.unquote(file.name)
|
|
response = FileResponse(file)
|
|
response['Content-Type'] = 'application/octet-stream'
|
|
response['Content-Disposition'] = 'attachment;filename="' + file_name + '"'
|
|
|
|
# 操作记录
|
|
# info = {
|
|
# "des": "下载附件",
|
|
# "detail": "后端存储路径: " + re_file + ", url解码文件名: " + file_name
|
|
# }
|
|
# create_operation_history_log(request, info, OperationHistoryLog)
|
|
|
|
return response
|
|
except Exception as e:
|
|
logger.error("download file failed: \n%s" % traceback.format_exc())
|
|
return CCAIResponse("下载失败", SERVER_ERROR)
|
|
|
|
|
|
|
|
|