1
0

file_upload.rs 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #![allow(non_snake_case)]
  2. use dioxus::prelude::*;
  3. fn main() {
  4. dioxus_desktop::launch(app);
  5. }
  6. fn app(cx: Scope) -> Element {
  7. let files_uploaded: &UseRef<Vec<String>> = use_ref(cx, Vec::new);
  8. cx.render(rsx! {
  9. input {
  10. r#type: "file",
  11. accept: ".txt, .rs",
  12. multiple: true,
  13. onchange: |evt| {
  14. to_owned![files_uploaded];
  15. async move {
  16. if let Some(file_engine) = &evt.files {
  17. let files = file_engine.files();
  18. for file_name in &files {
  19. if let Some(file) = file_engine.read_file_to_string(file_name).await{
  20. files_uploaded.write().push(file);
  21. }
  22. }
  23. }
  24. }
  25. },
  26. }
  27. div {
  28. width: "100px",
  29. height: "100px",
  30. border: "1px solid black",
  31. prevent_default: "ondrop dragover dragenter",
  32. ondrop: move |evt| {
  33. to_owned![files_uploaded];
  34. async move {
  35. if let Some(file_engine) = &evt.files {
  36. let files = file_engine.files();
  37. for file_name in &files {
  38. if let Some(file) = file_engine.read_file_to_string(file_name).await{
  39. files_uploaded.write().push(file);
  40. }
  41. }
  42. }
  43. }
  44. },
  45. ondragover: move |event: DragEvent| {
  46. event.stop_propagation();
  47. },
  48. "Drop files here"
  49. }
  50. ul {
  51. for file in files_uploaded.read().iter() {
  52. li { "{file}" }
  53. }
  54. }
  55. })
  56. }