js访问本地摄像头拍照并上传到Django中
时间: 2023-06-13 15:07:51 浏览: 225
实现这个功能需要使用JavaScript调用浏览器的媒体设备API获取摄像头信息,然后将拍摄的照片上传到Django服务器。
以下是一个简单的实现过程:
1. 在HTML中创建一个video标签和一个button按钮,并为按钮添加点击事件,代码如下:
```html
<!DOCTYPE html>
<html>
<head>
<title>Camera</title>
</head>
<body>
<video id="video" width="640" height="480" autoplay></video>
<button id="snap">Snap Photo</button>
<script src="{% static 'js/camera.js' %}"></script>
</body>
</html>
```
2. 在JavaScript中获取摄像头信息,并将摄像头流渲染到video标签中,代码如下:
```javascript
const video = document.getElementById('video');
const snapBtn = document.getElementById('snap');
// 获取摄像头信息
navigator.mediaDevices.getUserMedia({ video: true })
.then(stream => {
video.srcObject = stream;
video.play();
})
.catch(err => {
console.log('Error: ' + err);
});
// 拍照事件
snapBtn.addEventListener('click', () => {
const canvas = document.createElement('canvas');
canvas.width = video.videoWidth;
canvas.height = video.videoHeight;
const ctx = canvas.getContext('2d');
ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
const imgData = canvas.toDataURL('image/png');
uploadPhoto(imgData);
});
```
3. 编写上传照片的函数uploadPhoto,使用Fetch API将照片上传到Django服务器,并在服务器端保存照片文件,代码如下:
```javascript
function uploadPhoto(imgData) {
fetch('/upload_photo/', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ 'imgData': imgData })
})
.then(response => {
console.log('Photo uploaded successfully');
})
.catch(error => {
console.error('Error:', error);
});
}
```
4. 在Django中编写处理上传照片的视图函数upload_photo,代码如下:
```python
from django.http import JsonResponse
def upload_photo(request):
if request.method == 'POST':
img_data = request.POST['imgData']
img_data = img_data.replace('data:image/png;base64,', '')
img_data = base64.b64decode(img_data)
# 保存照片文件
with open('photo.png', 'wb') as f:
f.write(img_data)
return JsonResponse({'message': 'Photo uploaded successfully'})
```
注意事项:
1. 上传照片需要使用HTTP POST方法,因此需要在Fetch API中将method设置为'POST';
2. 在Fetch API中需要将请求头Content-Type设置为'application/json',并使用JSON.stringify将照片数据转换为JSON格式;
3. 在Django中获取POST请求数据时需要使用request.POST,而不是request.GET;
4. 在Django中保存照片文件时需要使用二进制方式打开文件并写入数据。
阅读全文