views.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. import random
  2. import string
  3. from django.shortcuts import render, redirect
  4. from account.decorators import login_required
  5. from file.models import File
  6. from django.http import FileResponse, JsonResponse, HttpResponse
  7. from django.utils import timezone
  8. from folder.models import Folder
  9. from .judgement_function import judge_filepath, format_size
  10. from django.utils.http import urlquote
  11. import os
  12. from account.models import get_user
  13. BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  14. DEBUG = 1
  15. # Create your views here.
  16. @login_required
  17. def upload_file(request):
  18. if request.method == "POST":
  19. user = get_user(request)
  20. try:
  21. file_obj = request.FILES.get('upload')
  22. except:
  23. print('文件不存在')
  24. return JsonResponse({'code': 401, 'error': '文件不存在'})
  25. file_type = judge_filepath(file_obj.name.split('.')[-1].lower()) if '.' in file_obj.name else ''
  26. update_time = timezone.now().strftime("%Y-%m-%d %H:%M:%S")
  27. file_size = file_obj.size
  28. file_name = file_obj.name
  29. folder_id = request.POST.get('folder_id')
  30. try:
  31. folder = Folder.objects.get(folder_id=folder_id)
  32. except:
  33. print('文件夹不存在')
  34. return JsonResponse({'code': 402, 'error': '文件夹不存在'})
  35. if not folder.check_permission(user=user):
  36. print('没有上传文件的权限')
  37. return JsonResponse({'code': 404, 'error': '没有上传文件的权限'})
  38. file = File.objects.create(file_name=file_name,
  39. folder=folder,
  40. update_time=update_time,
  41. file_size=file_size,
  42. file_type=file_type,
  43. owner=user,
  44. group=folder.group)
  45. # TODO: 文件hash
  46. try:
  47. file_dir = BASE_DIR + '/' + str(file.file_id)
  48. with open(file_dir, 'wb+') as f:
  49. for chunk in file_obj.chunks():
  50. f.write(chunk)
  51. except:
  52. print('文件保存失败')
  53. file.delete()
  54. return JsonResponse({'code': 500, 'error': '文件保存失败'})
  55. return JsonResponse({'code': 200})
  56. elif request.method == 'GET' and DEBUG:
  57. return render(request, 'upload_file.html')
  58. else:
  59. return HttpResponse(status=400)
  60. @login_required
  61. def download_file(request):
  62. if request.method == "POST":
  63. user = get_user(request)
  64. file_id = request.POST.get('file_id')
  65. try:
  66. file = File.objects.get(file_id=file_id)
  67. except:
  68. print('文件不存在')
  69. return JsonResponse({'code': 401, 'error': '文件不存在'})
  70. if not file.folder.check_permission(user=user):
  71. print('没有下载文件的权限')
  72. return JsonResponse({'code': 404, 'error': '没有下载文件的权限'})
  73. file_name = file.file_name
  74. file_dir = BASE_DIR + '/' + str(file.file_id)
  75. file = open(file_dir, 'rb')
  76. response = FileResponse(file)
  77. response['Content-Type'] = 'application/octet-stream'
  78. response['Content-Disposition'] = 'attachment;filename={}'.format(urlquote(file_name))
  79. return response
  80. elif request.method == 'GET' and DEBUG:
  81. return render(request, 'download_file.html')
  82. else:
  83. return HttpResponse(status=400)
  84. @login_required
  85. def delete_file(request):
  86. if request.method == "POST":
  87. data = request.POST
  88. user = get_user(request)
  89. file_id = data.get('file_id')
  90. try:
  91. file = File.objects.get(file_id=file_id)
  92. except:
  93. print('文件不存在')
  94. return JsonResponse({'code': 401, 'error': '文件不存在'})
  95. if not file.folder.check_permission(user=user) or (
  96. file.owner != user and (not file.group or file.group.creator != user)):
  97. print('没有删除文件的权限')
  98. return JsonResponse({'code': 404, 'error': '没有删除文件的权限'})
  99. try:
  100. os.remove(BASE_DIR + '/' + file_id)
  101. except:
  102. print('文件删除失败')
  103. return JsonResponse({'code': 500, 'error': '文件删除失败'})
  104. file.delete()
  105. return JsonResponse({'code': 200})
  106. elif request.method == 'GET' and DEBUG:
  107. return render(request, 'delete_file.html')
  108. else:
  109. return HttpResponse(status=400)