元素,可以实现图片选择和…">
当前位置:首页 > JavaScript

js实现上传图片

2026-02-28 21:53:50JavaScript

使用HTML5 File API实现图片上传

HTML5的File API允许通过JavaScript访问用户选择的文件。结合<input type="file">元素,可以实现图片选择和上传功能。

创建一个文件输入元素:

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

添加JavaScript事件监听:

js实现上传图片

document.getElementById('imageUpload').addEventListener('change', function(event) {
    const file = event.target.files[0];
    if (file) {
        const reader = new FileReader();
        reader.onload = function(e) {
            const img = document.createElement('img');
            img.src = e.target.result;
            document.body.appendChild(img);
        };
        reader.readAsDataURL(file);
    }
});

使用FormData对象发送图片到服务器

FormData对象可以方便地构建表单数据,适合用于文件上传。

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

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

实现拖放上传功能

HTML5拖放API可以让用户通过拖放方式上传图片。

js实现上传图片

<div id="dropArea" style="width:300px;height:200px;border:2px dashed #ccc;">
    拖放图片到这里
</div>
const dropArea = document.getElementById('dropArea');

dropArea.addEventListener('dragover', (e) => {
    e.preventDefault();
    dropArea.style.borderColor = '#666';
});

dropArea.addEventListener('dragleave', () => {
    dropArea.style.borderColor = '#ccc';
});

dropArea.addEventListener('drop', (e) => {
    e.preventDefault();
    dropArea.style.borderColor = '#ccc';
    const file = e.dataTransfer.files[0];
    if (file && file.type.match('image.*')) {
        uploadImage(file);
    }
});

预览和压缩图片

在客户端对图片进行预览和压缩可以减少服务器负担。

function compressImage(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 = Math.round((height * maxWidth) / width);
                width = maxWidth;
            }

            if (height > maxHeight) {
                width = Math.round((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);
        };
    });
}

显示上传进度

XMLHttpRequest对象可以监控上传进度。

function uploadWithProgress(file) {
    const xhr = new XMLHttpRequest();
    const formData = new FormData();
    formData.append('image', file);

    xhr.upload.addEventListener('progress', (e) => {
        const percent = Math.round((e.loaded / e.total) * 100);
        console.log(`上传进度: ${percent}%`);
    });

    xhr.addEventListener('load', () => {
        console.log('上传完成');
    });

    xhr.open('POST', '/upload');
    xhr.send(formData);
}

使用第三方库简化上传

axios库可以简化上传过程,提供更好的API。

import axios from 'axios';

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

    axios.post('/upload', formData, {
        headers: {
            'Content-Type': 'multipart/form-data'
        },
        onUploadProgress: progressEvent => {
            const percent = Math.round((progressEvent.loaded / progressEvent.total) * 100);
            console.log(`上传进度: ${percent}%`);
        }
    })
    .then(response => {
        console.log('上传成功:', response.data);
    })
    .catch(error => {
        console.error('上传失败:', error);
    });
}

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

相关文章

js 实现vue模板

js 实现vue模板

实现 Vue 模板的 JavaScript 方法 通过原生 JavaScript 可以实现类似 Vue 的模板渲染功能,主要包括数据绑定、指令处理和模板解析。以下是核心实现思路: 数据绑定与响应式…

h5实现上传图片

h5实现上传图片

实现H5图片上传的基础方法 使用HTML5的<input type="file">元素配合JavaScript的File API可以实现图片上传功能。基本实现代码如下: <inpu…

js 实现分页

js 实现分页

实现分页的基本逻辑 分页功能通常需要后端返回数据总量或总页数,前端根据当前页码和每页条数截取对应数据。以下是一个基于JavaScript的简单分页实现方案: 前端分页实现 假设已有从后端获取的完整…

js实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…

js实现图

js实现图

JavaScript 实现图的常用方法 在 JavaScript 中,图(Graph)可以通过多种方式实现,常见的包括邻接表(Adjacency List)和邻接矩阵(Adjacency Matrix…

js实现自举

js实现自举

实现 JavaScript 自举的方法 JavaScript 自举(Bootstrap)通常指通过 JavaScript 动态加载自身或依赖的脚本,实现运行时环境的初始化或扩展。以下是几种常见实现方式…