views.py 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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.debug import debug_view
  11. from utils.http import make_json_response
  12. from utils.permission import can_delete
  13. from utils.crypto import secure_transport
  14. BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  15. # Create your views here.
  16. @secure_transport
  17. # @debug_view(template_name='upload_file.html')
  18. @login_required
  19. def upload_file(request):
  20. data = request.POST
  21. user = get_user(request)
  22. key = data.get('token')
  23. try:
  24. file_obj = request.FILES.get('file')
  25. except:
  26. return make_json_response(code=400, error='文件不存在')
  27. update_time = timezone.now().strftime("%Y-%m-%d %H:%M:%S")
  28. file_size = file_obj.size
  29. file_name = file_obj.name
  30. file_type = judge_filepath(file_name.split('.')[-1].lower()) if '.' in file_name else ''
  31. father_folder_id = data.get('father_folder_id')
  32. try:
  33. folder = Folder.objects.get(folder_id=father_folder_id)
  34. except:
  35. return make_json_response(code=402, error='文件夹不存在')
  36. if not folder.check_permission(user=user):
  37. return make_json_response(code=404, error='没有上传文件的权限')
  38. file = File.objects.create(file_name=file_name,
  39. father_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. key=key)
  46. # TODO: 文件hash
  47. try:
  48. file_dir = BASE_DIR + '/' + str(file.file_id)
  49. with open(file_dir, 'wb+') as f:
  50. for chunk in file_obj.chunks():
  51. f.write(chunk)
  52. except:
  53. file.delete()
  54. return make_json_response(code=500, error='文件保存失败')
  55. return make_json_response()
  56. @secure_transport
  57. # @debug_view('file_id')
  58. @login_required
  59. def download_file(request):
  60. user = get_user(request)
  61. file_id = request.POST.get('file_id')
  62. try:
  63. file = File.objects.get(file_id=file_id)
  64. except:
  65. return make_json_response(code=402, error='文件不存在')
  66. if not file.father_folder.check_permission(user=user):
  67. return make_json_response(code=404, error='没有下载文件的权限')
  68. file_name = file.file_name
  69. file_dir = BASE_DIR + '/' + str(file.file_id)
  70. file = open(file_dir, 'rb')
  71. response = FileResponse(file)
  72. response['Content-Type'] = 'application/octet-stream'
  73. response['Content-Disposition'] = 'attachment;filename={}'.format(urlquote(file_name))
  74. return response
  75. @secure_transport
  76. # @debug_view('file_id')
  77. @login_required
  78. def delete_file(request):
  79. data = request.POST
  80. user = get_user(request)
  81. file_id = data.get('file_id')
  82. try:
  83. file = File.objects.get(file_id=file_id)
  84. except:
  85. return make_json_response(code=402, error='文件不存在')
  86. if not can_delete(user=user, f=file):
  87. return make_json_response(code=404, error='没有删除文件的权限')
  88. file.delete()
  89. return make_json_response()