Compare commits

...

5 Commits

Author SHA1 Message Date
Johannes Heuel
f5af0c8711 check status code of upload request 2023-03-04 20:41:32 +01:00
Johannes Heuel
4709e2a0ab implement s3 upload from drag and drop 2023-03-04 20:26:57 +01:00
Johannes Heuel
dbceb95154 Merge branch 'main' of gitea:jheuel/photos 2023-03-04 17:40:03 +01:00
Johannes Heuel
99372bce54 . 2023-03-04 17:39:58 +01:00
Johannes Heuel
26dab06063 . 2023-03-04 17:38:50 +01:00
2 changed files with 59 additions and 12 deletions

View File

@@ -1,7 +1,7 @@
function getFilesDataTransferItems(dataTransferItems) {
function traverseFileTreePromise(item, path = "", folder) {
return new Promise(resolve => {
if (item === null) {
if (item === null || typeof item === 'undefined') {
// nothing to do
} else if (item.isFile) {
item.file(file => {
@@ -28,10 +28,17 @@ function getFilesDataTransferItems(dataTransferItems) {
let files = [];
return new Promise((resolve, reject) => {
let entriesPromises = [];
for (let it of dataTransferItems)
for (let it of dataTransferItems) {
let entry;
if (typeof it.webkitGetAsEntry === 'function') {
entry = it.webkitGetAsEntry();
} else if (typeof it.getAsEntry === 'function') {
entry = it.getAsEntry();
}
entriesPromises.push(
traverseFileTreePromise(it.webkitGetAsEntry(), "", files)
traverseFileTreePromise(entry, "", files)
);
}
Promise.all(entriesPromises).then(entries => {
resolve(files);
});
@@ -42,6 +49,34 @@ export function get_files_data_transfer_items(data_transfer_items) {
return getFilesDataTransferItems(data_transfer_items);
}
export function upload_file(file, url) {
new Promise(resolve => console.log(file, url));
function read_file(file) {
return new Promise((resolve, reject) => {
let reader = new FileReader();
reader.onloadend = () => {
resolve(reader.result)
};
reader.onerror = reject;
reader.readAsArrayBuffer(file);
});
}
export function upload_file(file, url) {
return new Promise((resolve, reject) => {
read_file(file).then((content) => {
fetch(url, {
method: 'PUT',
headers: {
'Accept': 'application/json',
'Content-Type': 'multipart/form-data',
},
body: new Blob([content], { type: file.type }),
}).then((resp) => {
if (resp.status >= 200 && resp.status < 300) {
resolve(resp);
} else {
reject(resp);
}
});
}).catch(error => reject(error));
});
}

View File

@@ -3,7 +3,7 @@ use crate::gallery::Grid;
use crate::hooks::use_user_context;
use gloo_net::http::Request;
use js_sys::Array;
use js_sys::{Array, Promise};
use serde::{Deserialize, Serialize};
use wasm_bindgen::{prelude::wasm_bindgen, JsCast, JsValue};
use web_sys::{
@@ -76,10 +76,6 @@ pub fn home() -> Html {
if let Ok(fse) = d.clone().dyn_into::<File>() {
console_log!(&fse);
files.push(fse.clone());
wasm_bindgen_futures::spawn_local(async move {
let promise = upload_file(fse, "bla".to_owned());
let _result = wasm_bindgen_futures::JsFuture::from(promise).await.unwrap();
});
} else if let Ok(a) = d.clone().dyn_into::<js_sys::Array>() {
for i in 0..a.length() {
let f = a.get(i);
@@ -108,6 +104,7 @@ pub fn home() -> Html {
news.iter().for_each(|x| new_files.push(x.clone()));
fs.iter().for_each(|x| files.push(x.clone()));
}
let uiae: Vec<String> = files
.iter()
.map(|x| {
@@ -119,8 +116,8 @@ pub fn home() -> Html {
})
.collect();
console_log!("end", uiae.join("\n"));
let url = "/api/photos/upload";
let photos: PhotosUrlsWrapper = Request::post(url)
let photos: PhotosUrlsWrapper = Request::post("/api/photos/upload")
.json(&PhotosWrapper { photos: uiae })
.unwrap()
.send()
@@ -130,6 +127,21 @@ pub fn home() -> Html {
.await
.unwrap();
console_log!("{}", serde_json::to_string(&photos).unwrap());
console_log!("", files.len());
let mut promises: Vec<Promise> = Vec::new();
for (file, (_, url)) in files.iter().zip(photos.photos) {
console_log!("uploading: ", &file.name(), &url);
promises.push(upload_file(file.clone(), url.clone()));
}
for promise in promises {
match wasm_bindgen_futures::JsFuture::from(promise).await {
Ok(result) => console_log!(result),
_ => console_log!("errooooor"),
};
}
console_log!("all uploaded");
});
});