瀏覽代碼

#220 began moving to quasar uploader for ui.upload

Rodja Trappe 2 年之前
父節點
當前提交
9ad0d56c9e
共有 3 個文件被更改,包括 20 次插入28 次删除
  1. 16 14
      nicegui/elements/upload.py
  2. 1 4
      nicegui/elements/upload.vue
  3. 3 10
      nicegui/events.py

+ 16 - 14
nicegui/elements/upload.py

@@ -1,8 +1,11 @@
-from typing import Callable, Dict, Optional
+from typing import Callable, Optional
+
+from fastapi import Request, Response
 
 from ..dependencies import register_component
 from ..element import Element
-from ..events import UploadEventArguments, UploadFile, handle_event
+from ..events import UploadEventArguments, handle_event
+from ..nicegui import app
 
 register_component('upload', __file__, 'upload.vue')
 
@@ -27,19 +30,18 @@ class Upload(Element):
         self._props['file_picker_label'] = file_picker_label
         self._props['upload_button_icon'] = upload_button_icon
 
-        def upload(msg: Dict) -> None:
-            files = [
-                UploadFile(
-                    content=file['content'],
-                    name=file['name'],
-                    lastModified=file['lastModified'],
-                    size=file['size'],
-                    type=file['type'],
+        @app.post('/_nicegui/upload')
+        async def upload_route(request: Request) -> Response:
+            for data in (await request.form()).values():
+                args = UploadEventArguments(
+                    sender=self,
+                    client=self.client,
+                    content=data.file,
+                    name=data.filename,
+                    type=data.content_type,
                 )
-                for file in msg['args']
-            ]
-            handle_event(on_upload, UploadEventArguments(sender=self, client=self.client, files=files))
-        self.on('upload', upload)
+                handle_event(on_upload, args)
+            return {'upload': 'success'}
 
     def reset(self) -> None:
         self.run_method('reset')

+ 1 - 4
nicegui/elements/upload.vue

@@ -1,8 +1,5 @@
 <template>
-  <div>
-    <q-file :label="file_picker_label" v-model="file" :multiple="multiple" />
-    <q-btn :icon="upload_button_icon" @click="upload" size="sm" round color="primary" />
-  </div>
+  <q-uploader url="_nicegui/upload" :label="file_picker_label" :multiple="multiple" />
 </template>
 
 <script>

+ 3 - 10
nicegui/events.py

@@ -1,7 +1,7 @@
 import traceback
 from dataclasses import dataclass
 from inspect import signature
-from typing import TYPE_CHECKING, Any, Callable, List, Optional
+from typing import TYPE_CHECKING, Any, BinaryIO, Callable, List, Optional
 
 from . import globals
 from .async_updater import AsyncUpdater
@@ -65,19 +65,12 @@ class JoystickEventArguments(EventArguments):
 
 
 @dataclass
-class UploadFile:
-    content: bytes
+class UploadEventArguments(EventArguments):
+    content: BinaryIO
     name: str
-    lastModified: float
-    size: int
     type: str
 
 
-@dataclass
-class UploadEventArguments(EventArguments):
-    files: List[UploadFile]
-
-
 @dataclass
 class ValueChangeEventArguments(EventArguments):
     value: Any