У меня есть форма, которая будет принимать пользовательский ввод текста, описания и изображения. Затем я загружаю данные формы и заставляю multer делать свое дело на стороне сервера. Моя проблема в том, что я хочу дать пользователю возможность выбрать, загружать изображение или использовать камеру и захватывать изображение. Я могу взять загруженное пользователем изображение и отправить его на сервер с текстом и описанием просто отлично.
У меня проблема с захватом изображения с веб-камеры пользователя и использованием его в качестве файла изображения, отправляемого с текстом и описанием. Я пытаюсь придерживаться синтаксиса данных формы, потому что это то, что читает Мультер.
Я где-то читал, что только мобильные телефоны читают <input type="file" accept="image/*;capture=camera" id="example-img" name="userPhoto" class="form-control" placeholder="Enter Example img">
- вот почему я пытаюсь использовать getUserMedia, но я просто не могу понять, как включить его в логику данных формы. Пожалуйста, любая помощь будет очень признателен.
Заранее спасибо!
Вот мой подход:
HTML:
<div class="form-group">
<label for="example-text">Example Text</label>
<input type="text" id="example-text" class="form-control" aria-describedby="example-text"
placeholder="Enter Example Text" name="title">
</div>
<div class="form-group">
<label for="example-description">Example Description</label>
<textarea class="form-control" id="example-description" aria-describedby="example-description"
placeholder="Enter Example Description" name="description"></textarea>
</div>
{{!-- adding our own img input to be read by multer --}}
<div class="form-group">
<label for="example-img">Example Image</label>
<input type="file" accept="image/*;capture=camera" id="example-img" name="userPhoto" class="form-control"
placeholder="Enter Example img">
<section id="camera">
<!-- Camera sensor -->
<canvas id="camera--sensor"></canvas>
<!-- Camera view -->
<video id="camera--view" autoplay playsinline></video>
<!-- Camera output -->
<!-- Camera trigger -->
<button id="camera--trigger" class="btn btn-primary">Take a picture</button>
</section>
<img id="myImg" src="//:0" alt="your image" width="200">
</div>
<button id="submitForm" class="btn btn-primary float-right">Submit</button>
</form>```
//JS:
const cameraView = document.querySelector("#camera--view"),
cameraSensor = document.querySelector("#camera--sensor"),
cameraTrigger = $("#camera--trigger"),
imgEl = $("#myImg")
//video constraints
var constraints = {
video: {
facingMode: "environment"
},
audio: false
};
//start camera function
function cameraStart() {
navigator.mediaDevices
.getUserMedia(constraints)
.then(function (stream) {
track = stream.getTracks()[0];
cameraView.srcObject = stream;
})
.catch(function (error) {
console.error("Oops. Something is broken.", error);
});
}
//Capture image
function capturePhoto(event) {
event.preventDefault();
console.log("Click");
var capPhoto = input.files[0];
console.log("This is in the Capture Photo method" + capPhoto);
cameraSensor.width = cameraView.videoWidth;
cameraSensor.height = cameraView.videoHeight;
cameraSensor.getContext("2d").drawImage(cameraView, 0, 0);
imgEl.attr("src", cameraSensor.toDataURL("image/png"));
// imgEl.classList.add("taken");
}
//send to server
saveExample: function () {
var formData = new FormData(postForm[0]);
console.log(postForm[0]);
// console.log("This is form data: " + JSON.stringify(postForm[0]));
console.log(formData);
console.log(formData.entries());
return $.ajax({
type: "POST",
enctype: "multipart/form-data",
url: "api/posts",
data: formData,
processData: false, // Important!
contentType: false,
cache: false,
// data: JSON.stringify(example),
success: function (returnData) {
console.log(returnData);
console.log(data);
},
error: function (err) {
console.log("error", err);
}
});
},
window.addEventListener("load", cameraStart, false);
cameraTrigger.on("click", capturePhoto)