Quellcode durchsuchen

兼容旧版无加密传输文件

ignatz vor 4 Jahren
Ursprung
Commit
b8a1a753ef

+ 0 - 4
2

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

+ 0 - 4
8

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


+ 27 - 0
account/migrations/0003_auto_20210911_1439.py

@@ -0,0 +1,27 @@
+# Generated by Django 3.2.7 on 2021-09-11 06:39
+
+import account.validators
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('account', '0002_delete_profile'),
+    ]
+
+    operations = [
+        migrations.AlterModelOptions(
+            name='user',
+            options={},
+        ),
+        migrations.AlterField(
+            model_name='user',
+            name='username',
+            field=models.CharField(max_length=25, unique=True, validators=[account.validators.ASCIIUsernameValidator()]),
+        ),
+        migrations.AlterModelTable(
+            name='user',
+            table=None,
+        ),
+    ]

BIN
db.sqlite3


+ 38 - 0
file/migrations/0006_auto_20210911_1439.py

@@ -0,0 +1,38 @@
+# Generated by Django 3.2.7 on 2021-09-11 06:39
+
+from django.db import migrations, models
+import uuid
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('file', '0005_rename_folder_file_father_folder'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='file',
+            name='file_size',
+        ),
+        migrations.RemoveField(
+            model_name='file',
+            name='update_time',
+        ),
+        migrations.AddField(
+            model_name='file',
+            name='key',
+            field=models.CharField(default=123456, max_length=1024),
+            preserve_default=False,
+        ),
+        migrations.AddField(
+            model_name='file',
+            name='upload_time',
+            field=models.DateTimeField(auto_now=True),
+        ),
+        migrations.AlterField(
+            model_name='file',
+            name='file_id',
+            field=models.UUIDField(auto_created=True, default=uuid.uuid4, editable=False, primary_key=True, serialize=False),
+        ),
+    ]

+ 18 - 0
file/migrations/0007_alter_file_key.py

@@ -0,0 +1,18 @@
+# Generated by Django 3.2.7 on 2021-09-11 08:12
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('file', '0006_auto_20210911_1439'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='file',
+            name='key',
+            field=models.CharField(blank=True, max_length=1024, null=True),
+        ),
+    ]

+ 6 - 3
file/models.py

@@ -29,14 +29,14 @@ class File(models.Model):
     # 文件大小
     # file_size = models.CharField(max_length=16)
 
-    key = models.CharField(max_length=1024)
+    key = models.CharField(max_length=1024, null=True, blank=True)
 
     owner = models.ForeignKey(User, on_delete=models.DO_NOTHING, related_name='files')
 
     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])
+        return settings.MEDIA_ROOT / f'{self.file_name}_{self.file_id}'
 
     def to_json(self):
         return {'file_id': self.file_id,
@@ -52,4 +52,7 @@ class File(models.Model):
 # 信号接收函数,每当删除file时自动删除文件
 @receiver(post_delete, sender=File)
 def delete_file(sender, instance, **kwargs):
-    os.remove(instance.get_path())
+    try:
+        os.remove(instance.get_path())
+    except:
+        print('找不到文件')

+ 34 - 10
file/views.py

@@ -1,6 +1,8 @@
 from account.decorators import login_required
 from file.models import File
 
+from django.http import FileResponse
+from django.utils.http import urlquote
 from folder.models import Folder
 from .judgement_function import judge_filepath
 from account.models import get_user
@@ -14,14 +16,23 @@ import base64
 
 
 @secure_transport
-# @debug_view(template_name='upload_file.html')
+@debug_view(template_name='upload_file.html')
 @login_required
 def upload_file(request):
     data = request.POST
     user = get_user(request)
     key = data.get('key')
-    file_b64 = data.get('file_b64')
-    file_name = data.get('file_name')
+    if key:
+        file_b64 = data.get('file_b64')
+        if not file_b64:
+            return make_json_response(code=400, error='文件不存在')
+        file_name = data.get('file_name')
+    else:
+        try:
+            file_obj = request.FILES.get('file')
+        except:
+            return make_json_response(code=400, error='文件不存在')
+        file_name = file_obj.name
     file_type = judge_filepath(file_name.split('.')[-1].lower()) if '.' in file_name else ''
     father_folder_id = data.get('father_folder_id')
     try:
@@ -38,10 +49,13 @@ def upload_file(request):
                                key=key)
     try:
         file_path = file.get_path()
-        f = open(file_path, 'wb+')
-        f.write(base64.b64decode(file_b64))
-        f.close()
-    except:
+        with open(file_path, 'wb+') as f:
+            if key:
+                f.write(base64.b64decode(file_b64))
+            else:
+                for chunk in file_obj.chunks():
+                    f.write(chunk)
+    except Exception as e:
         file.delete()
         return make_json_response(code=500, error='文件保存失败')
 
@@ -63,11 +77,21 @@ def download_file(request):
     try:
         file_path = file.get_path()
         f = open(file_path, 'rb')
-        file_b64 = base64.b64encode(f.read())
-        f.close()
     except:
         return make_json_response(code=500, error='文件读取失败')
-    return make_json_response(file_b64=file_b64, **file.to_json())
+    if file.key:
+        try:
+            file_b64 = base64.b64encode(f.read()).decode()
+            f.close()
+        except:
+            return make_json_response(code=500, error='文件读取失败')
+        return make_json_response(file_b64=file_b64, **file.to_json())
+    else:
+        file_name = file.file_name
+        response = FileResponse(f)
+        response['Content-Type'] = 'application/octet-stream'
+        response['Content-Disposition'] = 'attachment;filename={}'.format(urlquote(file_name))
+        return response
 
 
 @secure_transport

+ 1 - 1
templates/upload_file.html

@@ -14,7 +14,7 @@
                 <input type="text" id="father_folder_id" name="father_folder_id">
             </div>
             <div>
-                <input type="file" name="upload">
+                <input type="file" name="file">
             </div>
             <div>
                 <label for="token">token</label>

+ 0 - 0
7 → upload/1 (2).txt_7e31f1df-9d44-42db-9840-a709b868ac49