Я пытаюсь создать Rust Web App, используя Rocket , который загружает изображения с клиента.
Моя проблема в том, что я не знаю, как кодировать данные загруженного изображение (пиксели) в JSON на стороне клиента. Эти данные будут позже отправлены через AJAX.
. Запрос POST здесь жалуется, что image
это не String , а map . Это понятно, но я действительно хотел бы ПОСТАВИТЬ правильные данные на стороне Javascript (изображение на xhr.send()
), потому что я считаю, что это та часть, которую мне не хватает.
use rocket_contrib::json::{Json, JsonValue};
#[derive(Deserialize)]
pub struct Image {
file_type: String,
image: String,
message: String,
}
#[post("/img_upload", data = "<image>")]
pub fn upload(image: Json<Image>) -> JsonValue {
// here the back end should do some obscure matrix multiplications
json!({
"message": format!("Message {} received", image.0.message),
"received_type": image.0.file_type,
"image": image.0.image,
})
}
Изображение загружается клиентом:
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
<input type="file" name="fileb" id="fileb" />
</body>
<script src="./main_moc.js">
</script>
И это main_moc.js
.
var target_brows = document.getElementById("fileb");
target_brows.addEventListener('change', loadDoc);
// POST REQUEST TO SERVER: upload image
function loadDoc(event) {
var input = target_brows;
var file = input.files[0];
console.log(file);
if (validFileType(file)) {
var xhr = new XMLHttpRequest();
xhr.open("POST", "/img_upload");
xhr.onload = function(e) {
if(xhr.status === 200) {
console.log("Received stuff");
var data = JSON.parse(xhr.responseText);
console.log(data);
} else {
console.log("Some error:");
console.log(xhr.responseText);
}
}
xhr.send(JSON.stringify({
"file_type": file.type,
"image": file,
"message": "Apples"
}));
}
}
Я также пытался записать изображение из файла на холст и отправка данных с использованием context.getImageData()
, но это тоже не сработало (ошибка на стороне клиента).