views.py 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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. @debug_view('username', 'token', 'file_id')
  52. @login_required
  53. def download_file(request):
  54. user = get_user(request)
  55. file_id = request.POST.get('file_id')
  56. try:
  57. file = File.objects.get(file_id=file_id)
  58. except:
  59. return make_json_response(code=402, error='文件不存在')
  60. if not file.father_folder.check_permission(user=user):
  61. return make_json_response(code=404, error='没有下载文件的权限')
  62. file_name = file.file_name
  63. file_dir = BASE_DIR + '/' + str(file.file_id)
  64. file = open(file_dir, 'rb')
  65. response = FileResponse(file)
  66. response['Content-Type'] = 'application/octet-stream'
  67. response['Content-Disposition'] = 'attachment;filename={}'.format(urlquote(file_name))
  68. return response
  69. @debug_view('username', 'token', 'file_id')
  70. @login_required
  71. def delete_file(request):
  72. data = request.POST
  73. user = get_user(request)
  74. file_id = data.get('file_id')
  75. try:
  76. file = File.objects.get(file_id=file_id)
  77. except:
  78. return make_json_response(code=402, error='文件不存在')
  79. if not can_delete(user=user, f=file):
  80. return make_json_response(code=404, error='没有删除文件的权限')
  81. file.delete()
  82. return make_json_response()