ソースを参照

file.file_id use UUIDField instead AutoField
more secure file storage name

ignatz 4 年 前
コミット
6c53f1beab
1 ファイル変更14 行追加6 行削除
  1. 14 6
      file/models.py

+ 14 - 6
file/models.py

@@ -1,7 +1,10 @@
+import uuid
+
 from django.db import models
 from folder.models import Folder
 from account.models import User
 from group.models import Group
+from django.conf import settings
 # 引入内置信号
 from django.db.models.signals import post_delete
 # 引入信号接收器的装饰器
@@ -14,17 +17,17 @@ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
 # 文件表
 class File(models.Model):
     # 文件id
-    file_id = models.AutoField(primary_key=True)
+    file_id = models.UUIDField(primary_key=True, default=uuid.uuid4, auto_created=True, editable=False)
     # 文件名
     file_name = models.CharField(max_length=50, blank=False)
     # 从属的文件夹
     father_folder = models.ForeignKey(Folder, on_delete=models.CASCADE, related_name='children_files')
     # 上传时间
-    update_time = models.DateTimeField()
+    upload_time = models.DateTimeField(auto_now=True, editable=False)
     # 文件类型
     file_type = models.CharField(max_length=32)
     # 文件大小
-    file_size = models.CharField(max_length=16)
+    # file_size = models.CharField(max_length=16)
 
     key = models.CharField(max_length=1024)
 
@@ -32,16 +35,21 @@ class File(models.Model):
 
     group = models.ForeignKey(Group, on_delete=models.DO_NOTHING, related_name='files', null=True)
 
+    def get_path(self):
+        return '/'.join([settings.MEDIA_ROOT, self.file_id, self.file_name])
+
     def to_json(self):
         return {'file_id': self.file_id,
                 'file_name': self.file_name,
                 'father_folder_id': self.father_folder_id,
-                'update_time': self.update_time,
+                'upload_time': self.upload_time,
                 'file_type': self.file_type,
-                'file_size': self.file_size}
+                # 'file_size': self.file_size,
+                'key': self.key,
+                'file': 'file'}
 
 
 # 信号接收函数,每当删除file时自动删除文件
 @receiver(post_delete, sender=File)
 def delete_file(sender, instance, **kwargs):
-    os.remove(BASE_DIR + '/' + str(instance.file_id))
+    os.remove(instance.get_path())