Browse Source

upload_file

zoe 4 years ago
parent
commit
efecf4795a
8 changed files with 87 additions and 14 deletions
  1. 4 0
      2
  2. 4 0
      8
  3. BIN
      9
  4. BIN
      db.sqlite3
  5. 1 1
      file/models.py
  6. 50 4
      file/views.py
  7. 21 0
      folder/views.py
  8. 7 9
      st_cloud/settings.py

+ 4 - 0
2

@@ -0,0 +1,4 @@
+py manage.py migrate
+py manage.py makemigrations
+py manage.py createsuperuser
+py manage.py runserver

+ 4 - 0
8

@@ -0,0 +1,4 @@
+py manage.py migrate
+py manage.py makemigrations
+py manage.py createsuperuser
+py manage.py runserver

BIN
9


BIN
db.sqlite3


+ 1 - 1
file/models.py

@@ -33,7 +33,7 @@ class File(models.Model):
     def to_json(self):
         return {'file_id': self.file_id,
                 'file_name': self.file_name,
-                'folder_id': self.folder_id,
+                'father_folder_id': self.father_folder_id,
                 'update_time': self.update_time,
                 'file_type': self.file_type,
                 'file_size': self.file_size}

+ 50 - 4
file/views.py

@@ -22,16 +22,16 @@ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
 def upload_file(request):
     user = get_user(request)
     try:
-        file_obj = request.FILES.get('upload')
+        file_obj = request.FILES.get('file')
     except:
         return make_json_response(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')
+    file_type = judge_filepath(file_name.split('.')[-1].lower()) if '.' in file_name else ''
+    father_folder_id = request.POST.get('father_folder_id')
     try:
-        folder = Folder.objects.get(folder_id=folder_id)
+        folder = Folder.objects.get(folder_id=father_folder_id)
     except:
         return make_json_response(code=402, error='文件夹不存在')
     if not folder.check_permission(user=user):
@@ -53,6 +53,52 @@ def upload_file(request):
         file.delete()
         return make_json_response(code=500, error='文件保存失败')
     return make_json_response()
+    if request.method == "POST":
+        user = get_user(request)
+        try:
+            file_obj = request.FILES.get('file')
+            print(file_obj)
+        except Exception as e:
+            print(e)
+            print('文件不存在')
+            return JsonResponse({'code': 401, 'error': '文件不存在'})
+        update_time = timezone.now().strftime("%Y-%m-%d %H:%M:%S")
+        file_size = file_obj.size
+        file_name = file_obj.name
+        file_type = judge_filepath(file_name.split('.')[-1].lower()) if '.' in file_name else ''
+        father_folder_id = request.POST.get('father_folder_id')
+        print(f'file_name={file_name}, father_folder_id={father_folder_id}')
+        try:
+            father_folder = Folder.objects.get(folder_id=father_folder_id)
+        except Exception as e:
+            print(e)
+            print('文件夹不存在')
+            return JsonResponse({'code': 402, 'error': '文件夹不存在'})
+        if not father_folder.check_permission(user=user):
+            print('没有上传文件的权限')
+            return JsonResponse({'code': 404, 'error': '没有上传文件的权限'})
+        file = File.objects.create(file_name=file_name,
+                                   father_folder=father_folder,
+                                   update_time=update_time,
+                                   file_size=file_size,
+                                   file_type=file_type,
+                                   owner=user,
+                                   group=father_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)
 
 
 @debug_view('username', 'token', 'file_id')

+ 21 - 0
folder/views.py

@@ -40,6 +40,27 @@ def folder_list(request):
 @debug_view('username', 'token', 'father_folder_id', 'folder_name')
 @login_required
 def add_folder(request):
+    if request.method == 'POST':
+        data = request.POST
+        user = get_user(request)
+        # folder_id_random = ''.join(random.sample(string.digits, 8))
+        # father_folder = Folder.objects.filter(folder_id=data.get('father_folder_id')).get()
+
+        father_folder_id = data.get('father_folder_id')
+        try:
+            father_folder = user.folders.get(folder_id=father_folder_id)
+        except:
+            print('上级文件夹不存在')
+            return JsonResponse({'code': 421, 'error': '上级文件夹不存在'})
+
+        folder_name = data.get('folder_name')
+        print(f'folder_name={folder_name} father_folder_id={father_folder_id}')
+        Folder.objects.create(folder_name=folder_name, father_folder=father_folder, owner=user)
+        return JsonResponse({'code': 200})
+    elif request.method == 'GET' and DEBUG:
+        return render(request, 'add_folder.html')
+    else:
+        return HttpResponse(status=400)
     user = get_user(request)
     data = request.POST
     father_folder_id = data.get('father_folder_id')

+ 7 - 9
st_cloud/settings.py

@@ -15,7 +15,6 @@ from pathlib import Path
 # Build paths inside the project like this: BASE_DIR / 'subdir'.
 BASE_DIR = Path(__file__).resolve().parent.parent
 
-
 # Quick-start development settings - unsuitable for production
 # See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/
 
@@ -26,8 +25,7 @@ SALT = 'sa0v-038auwmd-r0awvy4-0y4vs9mdy9-aby09384vy-amr9tv8ybsva9v4y'
 # SECURITY WARNING: don't run with utils turned on in production!
 DEBUG = True
 
-ALLOWED_HOSTS = []
-
+ALLOWED_HOSTS = ['30gz758467.51vip.biz', '127.0.0.1']
 
 # Application definition
 
@@ -46,7 +44,6 @@ INSTALLED_APPS = [
     'account'
 ]
 
-
 MIDDLEWARE = [
     'corsheaders.middleware.CorsMiddleware',
     'django.middleware.security.SecurityMiddleware',
@@ -79,7 +76,6 @@ TEMPLATES = [
 
 WSGI_APPLICATION = 'st_cloud.wsgi.application'
 
-
 # Database
 # https://docs.djangoproject.com/en/3.2/ref/settings/#databases
 
@@ -90,11 +86,10 @@ DATABASES = {
     }
 }
 
-
 # Password validation
 # https://docs.djangoproject.com/en/3.2/ref/settings/#auth-password-validators
 
-PASSWORD_RESET_TIMEOUT = 3600
+PASSWORD_RESET_TIMEOUT = 360000
 
 AUTH_PASSWORD_VALIDATORS = [
     {
@@ -111,7 +106,6 @@ AUTH_PASSWORD_VALIDATORS = [
     },
 ]
 
-
 # Internationalization
 # https://docs.djangoproject.com/en/3.2/topics/i18n/
 
@@ -125,7 +119,6 @@ USE_L10N = True
 
 USE_TZ = True
 
-
 # Static files (CSS, JavaScript, Images)
 # https://docs.djangoproject.com/en/3.2/howto/static-files/
 
@@ -145,10 +138,15 @@ EMAIL_HOST_USER = 'lin-xinyuan@qq.com'
 EMAIL_HOST_PASSWORD = 'terwmysqpvxaeahe'
 DEFAULT_FROM_EMAIL = f'ST网盘 <{EMAIL_HOST_USER}>'
 
+CORS_ORIGIN_ALLOW_ALL = True
+
+CORS_ALLOW_CREDENTIALS = True
+
 
 # 跨域允许的请求方式,可以使用默认值,默认的请求方式为:
 # from corsheaders.defaults import default_methods
 CORS_ALLOW_METHODS = (
+
     'GET',
     'POST',
     'PUT',