import datetime
import logging
import pandas as pd
import json
import os
import time
import uuid
import re
import chardet
import subprocess
from subprocess import Popen, PIPE
from jwt import exceptions
from app01.dao.dao import query_kc_info_user, query_department, increasenum
from app01.serializerss.rosterserializers import RosterSerializers, JobNumberSerializers, UserinfoSerializers, \
UserinfoSerializerss
# , APIInfoSerializer, APISerializer
from app01 import models
from app01 import fileupload
from rest_framework import generics, views, viewsets
from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination
from rest_framework.parsers import JSONParser
from rest_framework.renderers import JSONRenderer, BrowsableAPIRenderer
from rest_framework.parsers import MultiPartParser
from rest_framework.views import APIView
from rest_framework.generics import ListAPIView
from rest_framework.response import Response
from django.core.files.storage import default_storage
from django.core.files.base import ContentFile
from django.conf import settings
from django.shortcuts import render
from django.http.response import JsonResponse
from django.views.generic import View
from common.utils.upladfile.util import time_stamp_to_date
from common.utils.upladfile.util_store import file_store_path,file_pdf
from common.utils.my_response import MyResponse
import os
import re
import time
import json
import subprocess
# 上传文件保存的工具类
from django.conf import settings
def file_pdf(staffnum=None, uploadtype=None, target_path=None, fileName=None):
if os.path.splitext(target_path)[-1] == ".docx" or os.path.splitext(target_path)[-1] == ".doc" or \
os.path.splitext(target_path)[-1] == ".txt":
# print(1111111111111, os.path.splitext(target_path))
# print('filename',filename)
# print("""target_path.split('.')[0] + ".pdf""",target_path.split('.')[0] + ".pdf")
if os.path.exists(target_path.split('.')[0] + ".pdf"):
# print(222222222222222)
pass
else:
infile = os.path.dirname(target_path)
# print("infile:{}".format(infile))
# print("target_path:{}".format(target_path))
# (target_path,infile)
args = ['libreoffice', '--headless', '--convert-to', 'pdf', '--outdir', infile, target_path]
# args = 'libreoffice7.0 --convert-to pdf:writer_pdf_Export %s --outdir %s' % (target_path,infile)
process = subprocess.run(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print('process', process)
re.search('-> (.*?) using filter', process.stdout.decode())
toNames = target_path.split('.')[0] + ".pdf"
toName = os.path.join('https://hr.hamc.edu.cn/api/v1/file',
os.path.relpath(toNames, '/opt/hr/static/media/'))
else:
toNames = target_path
toName = os.path.join('https://hr.hamc.edu.cn/api/v1/file',
os.path.relpath(toNames, '/opt/hr/static/media/'))
res_num = models.UserInfos.objects.filter(staff_num=staffnum).first()
if res_num:
# print(222222222)
file_certificates = {'filename': fileName, 'file_pdf': toName}
# print('toName', toName)
if uploadtype == 'licensed':
if res_num.licensed:
licensed = json.loads(res_num.licensed)
# print('licensed', licensed, type(licensed))
licensed.append(file_certificates)
ser = UserinfoSerializers(instance=res_num,
data={'licensed': json.dumps(licensed, ensure_ascii=False)}) # 注意指定参数
if ser.is_valid(raise_exception=True):
ser.save()
else:
file_certificates = [{'filename': fileName, 'file_pdf': toName}]
ser = UserinfoSerializers(instance=res_num,
data={'licensed': json.dumps(file_certificates,
ensure_ascii=False)}) # 注意指定参数
if ser.is_valid(raise_exception=True):
ser.save()
if uploadtype == 'college_teacher_certificate':
if res_num.college_teacher_certificate:
college_teacher_certificate = json.loads(res_num.college_teacher_certificate)
# print('college_teacher_certificate', college_teacher_certificate,
# type(college_teacher_certificate))
college_teacher_certificate.append(file_certificates)
ser = UserinfoSerializers(instance=res_num, data={
'college_teacher_certificate': json.dumps(college_teacher_certificate,
ensure_ascii=False)}) # 注意指定参数
if ser.is_valid(raise_exception=True):
ser.save()
else:
file_certificates = [{'filename': fileName, 'file_pdf': toName}]
ser = UserinfoSerializers(instance=res_num,
data={'college_teacher_certificate': json.dumps(file_certificates,
ensure_ascii=False)}) # 注意指定参数
if ser.is_valid(raise_exception=True):
ser.save()
else:
file_certificate = json.dumps([{'filename': fileName, 'file_pdf': toName}], ensure_ascii=False)
if uploadtype == 'licensed':
ser = UserinfoSerializers(data={'staff_num': staffnum, 'licensed': file_certificate}) # 注意指定参数
if ser.is_valid(raise_exception=True):
ser.save()
if uploadtype == 'college_teacher_certificate':
ser = UserinfoSerializers(
data={'staff_num': staffnum, 'college_teacher_certificate': file_certificate}) # 注意指定参数
if ser.is_valid(raise_exception=True):
ser.save()
res_nums = models.UserInfos.objects.filter(staff_num=staffnum).first()
pp_dict = {'college_teacher_certificate': '', 'licensed': ''}
ser = UserinfoSerializerss(instance=res_nums, many=False) # 进行序列化操作,指定更多集合对象
if ser.data['college_teacher_certificate']:
lii = []
for licenses in json.loads(ser.data['college_teacher_certificate']):
license_dicts = {'filename': '', 'filetype': '', 'file_pdf': licenses.get('file_pdf')}
if licenses:
license_dicts['filetype'] = licenses.get('filename').split('.')[1]
license_dicts['filename'] = licenses.get('filename').split('.')[0]
lii.append(license_dicts)
pp_dict['college_teacher_certificate'] = lii
if ser.data['licensed']:
li = []
for license in json.loads(ser.data['licensed']):
license_dict = {'filename': '', 'filetype': '', 'file_pdf': license.get('file_pdf')}
# print(license)
if license:
license_dict['filetype'] = license.get('filename').split('.')[1]
license_dict['filename'] = license.get('filename').split('.')[0]
li.append(license_dict)
# print("ser.data['licensed']", json.loads(ser.data['licensed']), type(json.loads(ser.data['licensed'])))
pp_dict['licensed'] = li
return pp_dict
class UploadFile(APIView):
"""
大文件分片上传
"""
parser_classes = [MultiPartParser, JSONParser]
def get(self, request, *args, **kwargs):
ret = {'status': '', 'data': '', 'msg': '这是get请求'}
key = request.GET.get('key')
shardindex = request.GET.get('shardIndex')
filename = request.GET.get('filename')
staffnum = request.GET.get('staffnum')
uploadtype = request.GET.get('uploadtype')
file_path = os.path.join(settings.MEDIA_ROOT) + '/media' # 文件分片的保存的位置
shard = '%s_%s' % (shardindex, key)
time_stamp = time.time()
t_path = file_store_path(float(time_stamp)) # 合成文件的保存路径
target_path = os.path.join(t_path, '%s' % filename) # 合成文件的命名
if os.path.exists(target_path):
pp_dict = file_pdf(staffnum=staffnum, uploadtype=uploadtype, target_path=target_path, fileName=filename)
ret['data'] = pp_dict
ret['status'] = 2
ret['msg'] = '秒传'
return Response(ret)
# 检测分片是否存在
file_path_ = os.path.join(file_path, shard)
if os.path.exists(file_path_):
ret['data'] = shardindex
else:
ret['status'] = -1
return Response(ret)
def post(self, request, *args, **kwargs):
flag = False
ret = {'code': 200, 'status': '', 'data': '', 'msg': '这是post请求'}
upload_file = request.FILES.get("file", None)
if not upload_file:
ret['msg'] = '请选择文件后再上传'
return Response(ret)
uploadargs = request.POST
key = uploadargs.get('key') # 获取文件唯一标识符
shardIndex = int(uploadargs.get('shardIndex')) # 获取该分片在所有分片中的序号
shardSize = uploadargs.get('shardSize')
prepare = uploadargs.get('prepare')
shardTotal = uploadargs.get('shardTotal')
size = uploadargs.get('size')
fileName = uploadargs.get('fileName')
suffix = uploadargs.get('suffix')
staffnum = uploadargs.get('staffnum')
uploadtype = uploadargs.get('uploadtype')
time_stamp = time.time()
# upload_date = time_stamp_to_date(float(date)) # 格式化日期保存数据库中
t_path = file_store_path(float(time_stamp)) # 合成文件的保存路径
target_path = os.path.join(t_path, '%s' % fileName) # 合成文件的命名
if not os.path.exists(t_path):
os.makedirs(t_path)
date = time_stamp_to_date(time_stamp) # 时间戳转换为日期
chunk_path = os.path.join(settings.MEDIA_ROOT) + '/media'
if not os.path.exists(chunk_path):
os.makedirs(chunk_path)
filename = '%s_%s' % (shardIndex, key) # 构成该分片唯一标识符
destination = open(
os.path.join(chunk_path, filename), 'ab')
for chunk_ in upload_file.chunks(): # 分块写入文件
destination.write(chunk_)
destination.close()
if str(shardIndex) == shardTotal:
chunk = 1
with open(target_path, 'ab+') as target_file: # 创建新文件
while True:
try:
file_name = os.path.join(chunk_path, '%s_%s' % (chunk, key))
source_file = open(file_name, 'rb') # 按序打开每个分片
target_file.write(source_file.read()) # 读取分片内容写入新文件
source_file.close()
except IOError as e:
# print('这是什么错误e', e)
break
chunk += 1
os.remove(file_name) # 删除该分片,节约空间
ret['needMerge'] = 'true'
ret['status'] = 1
ret['timeStamp'] = date
ret['timeStamps'] = time_stamp
flag = True
else:
ret['status'] = 1
if flag:
pp_dict = file_pdf(staffnum=staffnum, uploadtype=uploadtype, target_path=target_path, fileName=fileName)
ret['data'] = pp_dict
# print("pp_dict", pp_dict, type(pp_dict))
return Response(ret)