1
0

file_upload.rs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #![allow(non_snake_case)]
  2. use dioxus::html::HasFileData;
  3. use dioxus::prelude::*;
  4. use tokio::time::sleep;
  5. fn main() {
  6. launch(App);
  7. }
  8. fn App() -> Element {
  9. let mut enable_directory_upload = use_signal(|| false);
  10. let mut files_uploaded = use_signal(|| Vec::new() as Vec<String>);
  11. let upload_files = move |evt: FormEvent| async move {
  12. for file_name in evt.files().unwrap().files() {
  13. // no files on form inputs?
  14. sleep(std::time::Duration::from_secs(1)).await;
  15. files_uploaded.write().push(file_name);
  16. }
  17. };
  18. let handle_file_drop = move |evt: DragEvent| async move {
  19. if let Some(file_engine) = &evt.files() {
  20. let files = file_engine.files();
  21. for file_name in &files {
  22. if let Some(file) = file_engine.read_file_to_string(file_name).await {
  23. files_uploaded.write().push(file);
  24. }
  25. }
  26. }
  27. };
  28. rsx! {
  29. label {
  30. input {
  31. r#type: "checkbox",
  32. checked: enable_directory_upload,
  33. oninput: move |evt| enable_directory_upload.set(evt.value().parse().unwrap()),
  34. },
  35. "Enable directory upload"
  36. }
  37. input {
  38. r#type: "file",
  39. accept: ".txt,.rs",
  40. multiple: true,
  41. directory: enable_directory_upload,
  42. onchange: upload_files,
  43. }
  44. div {
  45. width: "100px",
  46. height: "100px",
  47. border: "1px solid black",
  48. prevent_default: "ondrop dragover dragenter",
  49. ondrop: handle_file_drop,
  50. ondragover: move |event| event.stop_propagation(),
  51. "Drop files here"
  52. }
  53. ul {
  54. for file in files_uploaded.read().iter() {
  55. li { "{file}" }
  56. }
  57. }
  58. }
  59. }