files.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. import hashlib
  2. import os
  3. import uuid
  4. from datetime import datetime
  5. from django.contrib.auth.decorators import login_required
  6. from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
  7. from django.http import HttpResponseRedirect, JsonResponse
  8. from django.shortcuts import render
  9. from django.views.decorators.clickjacking import xframe_options_sameorigin
  10. from blog import models
  11. from system import settings
  12. from system.error.ServerException import ServerException
  13. from PIL import Image
  14. @xframe_options_sameorigin
  15. @login_required(login_url='/')
  16. def upload_markdown_img(request):
  17. file_obj = request.FILES.get('file')
  18. try:
  19. file_record = save_file(file_obj=file_obj)
  20. except Exception as e:
  21. return JsonResponse({"errno": 1, "message": str(e)})
  22. from PIL import Image
  23. img = Image.open(file_record.file_path + file_record.file_name)
  24. width, height = img.size
  25. if int(os.path.getsize(file_record.file_path + file_record.file_name) / 1024) > 1024:
  26. img.save(file_record.file_path + file_record.file_name, quality=75) # The saved downsized image size is 24.8kb
  27. img.close()
  28. print('Image size: {}x{}'.format(width, height))
  29. return JsonResponse({"errno": 0, "data": {
  30. 'url': file_record.file_net_path,
  31. 'alt': f'{width},{height}',
  32. "href": file_record.file_net_path,
  33. "width": width,
  34. "height": height
  35. }})
  36. def save_file(file_obj):
  37. def get_unique_str():
  38. uuid_str = str(uuid.uuid4())
  39. md5 = hashlib.md5()
  40. md5.update(uuid_str.encode('utf-8'))
  41. return md5.hexdigest()
  42. if file_obj is None:
  43. raise ServerException('文件不存在')
  44. else:
  45. file_type = file_obj.name.split('.')[-1]
  46. filename = get_unique_str() + '.' + file_obj.name.split('.')[-1]
  47. filepath = os.path.join(settings.UPLOAD_ROOT + '/' + file_type + '/')
  48. if not os.path.exists(filepath):
  49. os.mkdir(filepath)
  50. file_net_path = settings.DOMAIN + settings.UPLOAD_URL + '/' + file_type + '/' + filename
  51. f = open(filepath + filename, 'wb')
  52. for i in file_obj.chunks():
  53. f.write(i)
  54. f.close()
  55. file_record = models.FileRecord.objects.create(origin_name=file_obj.name, file_name=filename, file_path=filepath,
  56. create_date=datetime.now(),
  57. suffix=file_obj.name.split('.')[-1], file_net_path=file_net_path)
  58. return file_record
  59. @login_required(login_url='/')
  60. def files(request):
  61. # page: int = -1, is_paginator: bool = False, search_name: str = None
  62. if request.method == 'GET':
  63. page = request.GET.get('page')
  64. if page is None:
  65. page = 1
  66. else:
  67. page = int(page)
  68. search_name = request.GET.get('search_name')
  69. if search_name is None:
  70. files = models.FileRecord.objects.all().order_by("-create_date")
  71. else:
  72. files = models.FileRecord.objects.filter(origin_name__contains=search_name).order_by("-create_date")
  73. if page <= 0:
  74. page = 1
  75. paginator = Paginator(files, 15)
  76. try:
  77. files = paginator.page(page)
  78. except PageNotAnInteger:
  79. files = paginator.page(1)
  80. except EmptyPage:
  81. files = paginator.page(paginator.num_pages)
  82. return render(request, 'management/files/files.html', context={'files': files})
  83. @login_required(login_url='/')
  84. def delete(request):
  85. # page: int = -1, is_paginator: bool = False, search_name: str = None
  86. if request.method == 'GET':
  87. ids_str = request.GET.get("id")
  88. # models.files.objects.raw('DELETE FROM blog_files WHERE id IN (%s)', ids_str)
  89. models.FileRecord.objects.get(id=int(ids_str)).delete()
  90. return HttpResponseRedirect('/management/files') # 跳转到主界面
  91. else:
  92. raise ServerException("错误的请求")