| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- import random
- import string
- from django.shortcuts import render, redirect
- from account.decorators import login_required
- from file.models import File
- from django.http import FileResponse, JsonResponse, HttpResponse
- from django.utils import timezone
- from folder.models import Folder
- from .judgement_function import judge_filepath, format_size
- from django.utils.http import urlquote
- import os
- from account.models import get_user
- BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
- DEBUG = 1
- # Create your views here.
- @login_required
- def upload_file(request):
- if request.method == "POST":
- user = get_user(request)
- try:
- file_obj = request.FILES.get('upload')
- except:
- print('文件不存在')
- return JsonResponse({'code': 401, 'error': '文件不存在'})
- file_type = judge_filepath(file_obj.name.split('.')[-1].lower()) if '.' in file_obj.name else ''
- update_time = timezone.now().strftime("%Y-%m-%d %H:%M:%S")
- file_size = file_obj.size
- file_name = file_obj.name
- folder_id = request.POST.get('folder_id')
- try:
- folder = Folder.objects.get(folder_id=folder_id)
- except:
- print('文件夹不存在')
- return JsonResponse({'code': 402, 'error': '文件夹不存在'})
- if not folder.check_permission(user=user):
- print('没有上传文件的权限')
- return JsonResponse({'code': 404, 'error': '没有上传文件的权限'})
- file = File.objects.create(file_name=file_name,
- folder=folder,
- update_time=update_time,
- file_size=file_size,
- file_type=file_type,
- owner=user,
- group=folder.group)
- # TODO: 文件hash
- try:
- file_dir = BASE_DIR + '/' + str(file.file_id)
- with open(file_dir, 'wb+') as f:
- for chunk in file_obj.chunks():
- f.write(chunk)
- except:
- print('文件保存失败')
- file.delete()
- return JsonResponse({'code': 500, 'error': '文件保存失败'})
- return JsonResponse({'code': 200})
- elif request.method == 'GET' and DEBUG:
- return render(request, 'upload_file.html')
- else:
- return HttpResponse(status=400)
- @login_required
- def download_file(request):
- if request.method == "POST":
- user = get_user(request)
- file_id = request.POST.get('file_id')
- try:
- file = File.objects.get(file_id=file_id)
- except:
- print('文件不存在')
- return JsonResponse({'code': 401, 'error': '文件不存在'})
- if not file.folder.check_permission(user=user):
- print('没有下载文件的权限')
- return JsonResponse({'code': 404, 'error': '没有下载文件的权限'})
- file_name = file.file_name
- file_dir = BASE_DIR + '/' + str(file.file_id)
- file = open(file_dir, 'rb')
- response = FileResponse(file)
- response['Content-Type'] = 'application/octet-stream'
- response['Content-Disposition'] = 'attachment;filename={}'.format(urlquote(file_name))
- return response
- elif request.method == 'GET' and DEBUG:
- return render(request, 'download_file.html')
- else:
- return HttpResponse(status=400)
- @login_required
- def delete_file(request):
- if request.method == "POST":
- data = request.POST
- user = get_user(request)
- file_id = data.get('file_id')
- try:
- file = File.objects.get(file_id=file_id)
- except:
- print('文件不存在')
- return JsonResponse({'code': 401, 'error': '文件不存在'})
- if not file.folder.check_permission(user=user) or (
- file.owner != user and (not file.group or file.group.creator != user)):
- print('没有删除文件的权限')
- return JsonResponse({'code': 404, 'error': '没有删除文件的权限'})
- try:
- os.remove(BASE_DIR + '/' + file_id)
- except:
- print('文件删除失败')
- return JsonResponse({'code': 500, 'error': '文件删除失败'})
- file.delete()
- return JsonResponse({'code': 200})
- elif request.method == 'GET' and DEBUG:
- return render(request, 'delete_file.html')
- else:
- return HttpResponse(status=400)
|