views.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. from account.decorators import login_required
  2. from file.models import File
  3. from django.http import FileResponse
  4. from django.utils.http import urlquote
  5. from folder.models import Folder
  6. from .judgement_function import judge_filepath
  7. from account.models import get_user
  8. from utils.debug import debug_view
  9. from utils.http import make_json_response
  10. from utils.permission import can_delete
  11. from utils.crypto import secure_transport
  12. import base64
  13. # Create your views here.
  14. @secure_transport
  15. @debug_view(template_name='upload_file.html')
  16. @login_required
  17. def upload_file(request):
  18. data = request.POST
  19. user = get_user(request)
  20. key = data.get('key')
  21. if key:
  22. file_b64 = data.get('file_b64')
  23. if not file_b64:
  24. return make_json_response(code=400, error='文件不存在')
  25. file_name = data.get('file_name')
  26. else:
  27. try:
  28. file_obj = request.FILES.get('file')
  29. except:
  30. return make_json_response(code=400, error='文件不存在')
  31. file_name = file_obj.name
  32. file_type = judge_filepath(file_name.split('.')[-1].lower()) if '.' in file_name else ''
  33. father_folder_id = data.get('father_folder_id')
  34. try:
  35. folder = Folder.objects.get(folder_id=father_folder_id)
  36. except:
  37. return make_json_response(code=402, error='文件夹不存在')
  38. if not folder.check_permission(user=user):
  39. return make_json_response(code=404, error='没有上传文件的权限')
  40. file = File.objects.create(file_name=file_name,
  41. father_folder=folder,
  42. file_type=file_type,
  43. owner=user,
  44. group=folder.group,
  45. key=key)
  46. try:
  47. file_path = file.get_path()
  48. with open(file_path, 'wb+') as f:
  49. if key:
  50. f.write(base64.b64decode(file_b64))
  51. else:
  52. for chunk in file_obj.chunks():
  53. f.write(chunk)
  54. except Exception as e:
  55. file.delete()
  56. return make_json_response(code=500, error='文件保存失败')
  57. return make_json_response()
  58. @secure_transport
  59. # @debug_view('file_id')
  60. @login_required
  61. def download_file(request):
  62. user = get_user(request)
  63. file_id = request.POST.get('file_id')
  64. try:
  65. file = File.objects.get(file_id=file_id)
  66. except:
  67. return make_json_response(code=402, error='文件不存在')
  68. if not file.father_folder.check_permission(user=user):
  69. return make_json_response(code=404, error='没有下载文件的权限')
  70. try:
  71. file_path = file.get_path()
  72. f = open(file_path, 'rb')
  73. except:
  74. return make_json_response(code=500, error='文件读取失败')
  75. if file.key:
  76. try:
  77. file_b64 = base64.b64encode(f.read()).decode()
  78. f.close()
  79. except:
  80. return make_json_response(code=500, error='文件读取失败')
  81. return make_json_response(file_b64=file_b64, **file.to_json())
  82. else:
  83. file_name = file.file_name
  84. response = FileResponse(f)
  85. response['Content-Type'] = 'application/octet-stream'
  86. response['Content-Disposition'] = 'attachment;filename={}'.format(urlquote(file_name))
  87. return response
  88. @secure_transport
  89. # @debug_view('file_id')
  90. @login_required
  91. def delete_file(request):
  92. data = request.POST
  93. user = get_user(request)
  94. file_id = data.get('file_id')
  95. try:
  96. file = File.objects.get(file_id=file_id)
  97. except:
  98. return make_json_response(code=402, error='文件不存在')
  99. if not can_delete(user=user, f=file):
  100. return make_json_response(code=404, error='没有删除文件的权限')
  101. file.delete()
  102. return make_json_response()