当前位置:首页 > JavaScript

js实现图片上传

2026-04-03 18:05:14JavaScript

使用input元素实现图片上传

创建一个HTML文件输入元素,允许用户选择图片文件

<input type="file" id="imageUpload" accept="image/*">

监听文件选择变化事件,获取选中的图片文件

document.getElementById('imageUpload').addEventListener('change', function(event) {
    const file = event.target.files[0];
    if (!file) return;

    // 验证文件类型
    if (!file.type.match('image.*')) {
        alert('请选择图片文件');
        return;
    }
});

预览上传的图片

使用FileReader API读取图片文件并显示预览

const reader = new FileReader();
reader.onload = function(e) {
    const imgPreview = document.createElement('img');
    imgPreview.src = e.target.result;
    document.body.appendChild(imgPreview);
};
reader.readAsDataURL(file);

使用FormData上传图片到服务器

创建FormData对象并附加图片文件

const formData = new FormData();
formData.append('image', file);

使用fetch API发送图片到服务器

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

使用Canvas压缩图片

创建Canvas元素进行图片压缩

const img = new Image();
img.onload = function() {
    const canvas = document.createElement('canvas');
    const ctx = canvas.getContext('2d');

    // 设置压缩比例
    const MAX_WIDTH = 800;
    const MAX_HEIGHT = 800;
    let width = img.width;
    let height = img.height;

    if (width > height) {
        if (width > MAX_WIDTH) {
            height *= MAX_WIDTH / width;
            width = MAX_WIDTH;
        }
    } else {
        if (height > MAX_HEIGHT) {
            width *= MAX_HEIGHT / height;
            height = MAX_HEIGHT;
        }
    }

    canvas.width = width;
    canvas.height = height;
    ctx.drawImage(img, 0, 0, width, height);

    // 获取压缩后的图片数据
    canvas.toBlob(function(blob) {
        // 上传压缩后的图片
        const compressedFile = new File([blob], file.name, {
            type: 'image/jpeg',
            lastModified: Date.now()
        });

        const formData = new FormData();
        formData.append('image', compressedFile);
        // 继续上传流程...
    }, 'image/jpeg', 0.7);
};
img.src = URL.createObjectURL(file);

实现拖放上传功能

添加拖放区域HTML

<div id="dropArea" style="border: 2px dashed #ccc; padding: 20px;">
    拖放图片到这里上传
</div>

实现拖放事件处理

const dropArea = document.getElementById('dropArea');

// 阻止默认拖放行为
['dragenter', 'dragover', 'dragleave', 'drop'].forEach(eventName => {
    dropArea.addEventListener(eventName, preventDefaults, false);
});

function preventDefaults(e) {
    e.preventDefault();
    e.stopPropagation();
}

// 高亮显示拖放区域
['dragenter', 'dragover'].forEach(eventName => {
    dropArea.addEventListener(eventName, highlight, false);
});

['dragleave', 'drop'].forEach(eventName => {
    dropArea.addEventListener(eventName, unhighlight, false);
});

function highlight() {
    dropArea.style.borderColor = '#666';
}

function unhighlight() {
    dropArea.style.borderColor = '#ccc';
}

// 处理拖放文件
dropArea.addEventListener('drop', handleDrop, false);

function handleDrop(e) {
    const dt = e.dataTransfer;
    const files = dt.files;

    if (files.length) {
        handleFiles(files);
    }
}

function handleFiles(files) {
    const file = files[0];
    // 处理文件上传...
}

使用第三方库简化上传过程

使用Dropzone.js实现上传功能

<link rel="stylesheet" href="https://unpkg.com/dropzone@5/dist/min/dropzone.min.css">
<script src="https://unpkg.com/dropzone@5/dist/min/dropzone.min.js"></script>

<form action="/upload" class="dropzone" id="myDropzone"></form>

配置Dropzone选项

js实现图片上传

Dropzone.options.myDropzone = {
    paramName: "image",
    maxFilesize: 2, // MB
    acceptedFiles: "image/*",
    addRemoveLinks: true,
    dictDefaultMessage: "拖放图片到这里上传",
    dictFileTooBig: "文件太大 ({{filesize}}MB). 最大支持: {{maxFilesize}}MB.",
    dictInvalidFileType: "不支持的文件类型",
    dictResponseError: "服务器返回 {{statusCode}} 错误",
    dictCancelUpload: "取消上传",
    dictUploadCanceled: "上传已取消",
    dictRemoveFile: "移除文件",
    dictMaxFilesExceeded: "只能上传一个文件"
};

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

相关文章

js实现动画

js实现动画

使用 CSS 动画与 JavaScript 控制 通过 JavaScript 动态添加或移除 CSS 类来触发动画。CSS 定义关键帧(@keyframes),JavaScript 通过 classL…

js实现复制

js实现复制

使用document.execCommand方法 在较旧的浏览器中,可以使用document.execCommand('copy')实现复制功能。创建一个临时的textarea或input元素,将需要…

js实现列表

js实现列表

使用 JavaScript 实现列表 JavaScript 提供了多种方式来实现列表功能,包括数组操作、DOM 元素动态生成等。以下是几种常见的实现方法: 使用数组存储列表数据 数组是 JavaSc…

js实现选题

js实现选题

实现选题功能的JavaScript方法 基础实现方案 使用数组存储选项,通过随机索引选取: const options = ['选项A', '选项B', '选项C', '选项D']; const r…

js实现投球

js实现投球

实现投球动画的基本思路 使用JavaScript和CSS动画结合的方式模拟投球效果。核心是通过改变元素的位置、旋转和缩放属性,配合定时器或CSS过渡实现平滑动画。 创建基础HTML结构 <di…

js实现文字滚动

js实现文字滚动

实现文字滚动的几种方法 使用CSS动画实现滚动 通过CSS的@keyframes和transform属性可以实现平滑的文字滚动效果。 <style> .scroll-text { w…