views.py 5.3 KB

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