JavaScript调用摄像头拍照上传图片
设备:USB摄像头
HTML代码:
<!doctype html>
<html lang="en">
<head>
<title>upload picture</title>
<meta charset="utf-8">
<script src="https://code.jquery.com/jquery-3.0.0.min.js"></script>
</head>
<body>
<div>
<button onclick="openMedia()">开启摄像头</button>
<button onclick="takePhoto()">拍照</button>
<button id="uploadPhoto">上传</button>
<button onclick="closeMedia()">关闭摄像头</button>
</div>
<video id="video" width="500px" height="500px" autoplay="autoplay"></video>
<canvas id="canvas" width="500px" height="500px"></canvas>
<script>
let mediaStreamTrack = null; // 视频对象(全局)
function openMedia() {
let constraints = {
video: {width: 500, height: 500},
audio: true
};
//获得video摄像头
let video = document.getElementById('video');
let promise = navigator.mediaDevices.getUserMedia(constraints);
promise.then((mediaStream) => {
mediaStreamTrack = typeof mediaStream.stop === 'function' ? mediaStream : mediaStream.getTracks()[1];
video.srcObject = mediaStream;
video.play();
});
}
// 拍照
function takePhoto() {
//获得Canvas对象
let video = document.getElementById('video');
let canvas = document.getElementById('canvas');
let ctx = canvas.getContext('2d');
ctx.drawImage(video, 0, 0, 500, 500);
}
// 关闭摄像头
function closeMedia() {
mediaStreamTrack.stop();
}
// base64转File对象
function dataURLtoFile(dataurl, filename) {
var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
return new File([u8arr], filename, {type: mime});
}
$("#uploadPhoto").on("click", function () {
let file = dataURLtoFile(document.getElementById('canvas').toDataURL(), 'Filedata.jpg');
var formData = new FormData();
formData.append("file", file);
$.ajax({
url: 'http://127.0.0.1:8080/upload',
dataType: 'json',
type: 'POST',
async: false,
data: formData,
processData: false, // 使数据不做处理
contentType: false, // 不要设置Content-Type请求头
success: function (data) {
console.log(data);
alert('上传成功!');
},
error: function (response) {
console.log(response);
}
});
});
</script>
</body>
<!--
// 后端
// 添加临时文件目录
@Configuration
public class MultipartConfig {
@Bean
MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
factory.setLocation("E:\\temp");
return factory.createMultipartConfig();
}
}
// 跨域
@PostMapping(value = "/upload")
@CrossOrigin
public BaseResult upload(@RequestParam("file") MultipartFile file) throws Exception {
return BaseResult.success(file.getInputStream().available());
}
-->
浙公网安备 33010602011771号