元素,并设置accept="image/*"和capture="camera"属…">
当前位置:首页 > JavaScript

js 实现拍照上传

2026-03-01 03:15:44JavaScript

使用HTML5的input元素和File API

在HTML中创建一个<input type="file">元素,并设置accept="image/*"capture="camera"属性,这样在移动设备上会直接调用相机功能。

<input type="file" id="cameraInput" accept="image/*" capture="camera">

通过JavaScript监听change事件获取图片文件:

document.getElementById('cameraInput').addEventListener('change', function(e) {
    const file = e.target.files[0];
    if (file) {
        // 处理文件上传
        uploadImage(file);
    }
});

使用Canvas处理图片

如果需要调整图片大小或质量,可以使用Canvas API:

function processImage(file, maxWidth, maxHeight, quality) {
    return new Promise((resolve) => {
        const img = new Image();
        img.src = URL.createObjectURL(file);
        img.onload = () => {
            const canvas = document.createElement('canvas');
            let width = img.width;
            let height = img.height;

            if (width > maxWidth) {
                height *= maxWidth / width;
                width = maxWidth;
            }
            if (height > maxHeight) {
                width *= maxHeight / height;
                height = maxHeight;
            }

            canvas.width = width;
            canvas.height = height;
            const ctx = canvas.getContext('2d');
            ctx.drawImage(img, 0, 0, width, height);

            canvas.toBlob((blob) => {
                resolve(blob);
            }, 'image/jpeg', quality);
        };
    });
}

上传图片到服务器

使用FormData和fetch API上传图片:

async function uploadImage(file) {
    // 可选:先处理图片
    const processedBlob = await processImage(file, 800, 800, 0.8);

    const formData = new FormData();
    formData.append('image', processedBlob || file, 'photo.jpg');

    try {
        const response = await fetch('/upload', {
            method: 'POST',
            body: formData
        });
        const result = await response.json();
        console.log('上传成功:', result);
    } catch (error) {
        console.error('上传失败:', error);
    }
}

使用MediaDevices API直接访问摄像头

对于更高级的控制,可以使用getUserMedia API:

async function captureFromCamera() {
    try {
        const stream = await navigator.mediaDevices.getUserMedia({ video: true });
        const video = document.createElement('video');
        video.srcObject = stream;
        video.play();

        // 创建拍照按钮
        const button = document.createElement('button');
        button.textContent = '拍照';
        button.onclick = () => {
            const canvas = document.createElement('canvas');
            canvas.width = video.videoWidth;
            canvas.height = video.videoHeight;
            const ctx = canvas.getContext('2d');
            ctx.drawImage(video, 0, 0);

            canvas.toBlob((blob) => {
                uploadImage(blob);
                stream.getTracks().forEach(track => track.stop());
            }, 'image/jpeg');
        };

        document.body.appendChild(video);
        document.body.appendChild(button);
    } catch (err) {
        console.error('无法访问摄像头:', err);
    }
}

兼容性处理

对于不支持某些API的浏览器,需要提供备用方案:

function isCameraSupported() {
    return (
        (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) ||
        (navigator.getUserMedia) ||
        (navigator.webkitGetUserMedia) ||
        (navigator.mozGetUserMedia)
    );
}

if (!isCameraSupported()) {
    alert('您的浏览器不支持直接拍照功能,请使用文件上传');
}

移动端优化

在移动设备上,需要考虑横竖屏切换和全屏体验:

function setupMobileCamera() {
    if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) {
        document.documentElement.requestFullscreen();
        screen.orientation.lock('portrait').catch(() => {});
    }
}

安全考虑

确保网站使用HTTPS,因为许多摄像头API在非安全环境下不可用:

if (window.location.protocol !== 'https:') {
    console.warn('摄像头功能在非HTTPS环境下可能受限');
}

js 实现拍照上传

标签: 上传js
分享给朋友:

相关文章

js实现vue

js实现vue

Vue.js 简介 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。其核心库专注于视图层,易于与其他库或现有项目整合。 实现 Vue.js 的基本步骤 安装 Vue.…

js实现分页

js实现分页

分页的基本实现思路 在JavaScript中实现分页功能通常需要结合前端和后端逻辑。前端负责渲染分页控件和处理用户交互,后端负责提供分页数据。 前端分页实现 纯前端分页适用于数据量较小的情况,可以直…

js 实现倒计时

js 实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是两种常见实现方式。 使用 setInterval…

js轮播图实现原理

js轮播图实现原理

轮播图的基本原理 轮播图通过动态切换显示的内容(图片、文本等)实现视觉上的滑动效果。核心原理是利用CSS和JavaScript控制元素的显示与隐藏,或通过变换位置实现滑动动画。 实现方法一:…

js实现换肤

js实现换肤

使用CSS变量实现换肤 通过CSS变量可以轻松实现主题切换功能。CSS变量在根元素中定义,通过JavaScript动态修改这些变量值。 :root { --primary-color: #349…

js实现交换

js实现交换

交换变量的方法 在JavaScript中,交换两个变量的值有多种方法。以下是常见的几种实现方式: 使用临时变量 通过引入一个临时变量来存储其中一个变量的值,实现交换: let a = 1;…