import hashlib import os import uuid from datetime import datetime from django.contrib.auth.decorators import login_required from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage from django.http import HttpResponseRedirect, JsonResponse from django.shortcuts import render from django.views.decorators.clickjacking import xframe_options_sameorigin from blog import models from system import settings from system.error.ServerException import ServerException from PIL import Image @xframe_options_sameorigin @login_required(login_url='/') def upload_markdown_img(request): file_obj = request.FILES.get('file') try: file_record = save_file(file_obj=file_obj) except Exception as e: return JsonResponse({"errno": 1, "message": str(e)}) from PIL import Image img = Image.open(file_record.file_path + file_record.file_name) width, height = img.size if int(os.path.getsize(file_record.file_path + file_record.file_name) / 1024) > 1024: img.save(file_record.file_path + file_record.file_name, quality=75) # The saved downsized image size is 24.8kb img.close() print('Image size: {}x{}'.format(width, height)) return JsonResponse({"errno": 0, "data": { 'url': file_record.file_net_path, 'alt': f'{width},{height}', "href": file_record.file_net_path, "width": width, "height": height }}) def save_file(file_obj): def get_unique_str(): uuid_str = str(uuid.uuid4()) md5 = hashlib.md5() md5.update(uuid_str.encode('utf-8')) return md5.hexdigest() if file_obj is None: raise ServerException('文件不存在') else: file_type = file_obj.name.split('.')[-1] filename = get_unique_str() + '.' + file_obj.name.split('.')[-1] filepath = os.path.join(settings.UPLOAD_ROOT + '/' + file_type + '/') if not os.path.exists(filepath): os.mkdir(filepath) file_net_path = settings.DOMAIN + settings.UPLOAD_URL + '/' + file_type + '/' + filename f = open(filepath + filename, 'wb') for i in file_obj.chunks(): f.write(i) f.close() file_record = models.FileRecord.objects.create(origin_name=file_obj.name, file_name=filename, file_path=filepath, create_date=datetime.now(), suffix=file_obj.name.split('.')[-1], file_net_path=file_net_path) return file_record @login_required(login_url='/') def files(request): # page: int = -1, is_paginator: bool = False, search_name: str = None if request.method == 'GET': page = request.GET.get('page') if page is None: page = 1 else: page = int(page) search_name = request.GET.get('search_name') if search_name is None: files = models.FileRecord.objects.all().order_by("-create_date") else: files = models.FileRecord.objects.filter(origin_name__contains=search_name).order_by("-create_date") if page <= 0: page = 1 paginator = Paginator(files, 15) try: files = paginator.page(page) except PageNotAnInteger: files = paginator.page(1) except EmptyPage: files = paginator.page(paginator.num_pages) return render(request, 'management/files/files.html', context={'files': files}) @login_required(login_url='/') def delete(request): # page: int = -1, is_paginator: bool = False, search_name: str = None if request.method == 'GET': ids_str = request.GET.get("id") # models.files.objects.raw('DELETE FROM blog_files WHERE id IN (%s)', ids_str) models.FileRecord.objects.get(id=int(ids_str)).delete() return HttpResponseRedirect('/management/files') # 跳转到主界面 else: raise ServerException("错误的请求")