元素配合JavaScript的File API可以实现图片上传功能。以下是一个基础实现示例:
当前位置:首页 > JavaScript

js图片上传实现

2026-02-28 21:25:42JavaScript

图片上传的基本实现

使用HTML的<input type="file">元素配合JavaScript的File API可以实现图片上传功能。以下是一个基础实现示例:

<input type="file" id="imageUpload" accept="image/*">
<button onclick="uploadImage()">上传图片</button>
<img id="preview" style="max-width: 300px; display: none;">
function uploadImage() {
  const fileInput = document.getElementById('imageUpload');
  const file = fileInput.files[0];

  if (!file) {
    alert('请选择图片文件');
    return;
  }

  // 预览图片
  const preview = document.getElementById('preview');
  const reader = new FileReader();

  reader.onload = function(e) {
    preview.src = e.target.result;
    preview.style.display = 'block';
  };

  reader.readAsDataURL(file);
}

使用FormData上传到服务器

通过XMLHttpRequest或Fetch API将图片发送到服务器:

function uploadToServer() {
  const fileInput = document.getElementById('imageUpload');
  const file = fileInput.files[0];

  if (!file) return;

  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);
  });
}

图片压缩处理

在上传前可以使用Canvas API对图片进行压缩:

function compressImage(file, maxWidth = 800, quality = 0.7) {
  return new Promise((resolve) => {
    const reader = new FileReader();
    reader.readAsDataURL(file);

    reader.onload = function(event) {
      const img = new Image();
      img.src = event.target.result;

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

        let width = img.width;
        let height = img.height;

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

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

        canvas.toBlob((blob) => {
          resolve(new File([blob], file.name, {
            type: 'image/jpeg',
            lastModified: Date.now()
          }));
        }, 'image/jpeg', quality);
      };
    };
  });
}

多图片上传实现

通过multiple属性允许选择多个文件:

<input type="file" id="multiUpload" accept="image/*" multiple>
<button onclick="uploadMultiple()">上传多图</button>
async function uploadMultiple() {
  const fileInput = document.getElementById('multiUpload');
  const files = Array.from(fileInput.files);

  if (files.length === 0) return;

  const compressedFiles = await Promise.all(
    files.map(file => compressImage(file))
  );

  const formData = new FormData();
  compressedFiles.forEach((file, index) => {
    formData.append(`images[${index}]`, file);
  });

  // 上传逻辑同上
}

使用第三方库简化操作

可以考虑使用现成的库如Dropzone.js或FilePond:

<!-- Dropzone.js示例 -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.9.3/dropzone.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.9.3/dropzone.min.js"></script>

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

<script>
  Dropzone.options.myDropzone = {
    paramName: "file",
    maxFilesize: 5, // MB
    acceptedFiles: "image/*",
    dictDefaultMessage: "拖放图片到这里或点击上传",
    dictFileTooBig: "文件过大 ({{filesize}}MB). 最大支持: {{maxFilesize}}MB."
  };
</script>

进度显示实现

上传过程中显示进度条:

js图片上传实现

<div class="progress">
  <div id="progressBar" class="progress-bar" style="width: 0%"></div>
</div>
function uploadWithProgress(file) {
  const xhr = new XMLHttpRequest();
  const formData = new FormData();
  formData.append('image', file);

  xhr.upload.addEventListener('progress', (e) => {
    if (e.lengthComputable) {
      const percent = (e.loaded / e.total) * 100;
      document.getElementById('progressBar').style.width = `${percent}%`;
    }
  });

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

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

相关文章

js实现vue路由

js实现vue路由

Vue路由基础实现 使用Vue Router实现前端路由需要先安装并配置路由库。Vue Router是Vue.js官方的路由管理器。 安装Vue Router: npm install vue-r…

jquery.js

jquery.js

jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互等操作。以下是关于 jQuery.js 的核心信息和使用方法: 获…

js实现pdf在线预览

js实现pdf在线预览

使用PDF.js实现PDF在线预览 PDF.js是由Mozilla开发的一个开源JavaScript库,可以在网页中直接渲染PDF文件。以下是实现PDF在线预览的步骤: 引入PDF.js库 在HT…

js实现拷贝

js实现拷贝

实现文本拷贝 使用 document.execCommand 方法(已废弃但兼容性较好): function copyText(text) { const textarea = document…

js树实现

js树实现

树的基本概念 树是一种非线性的数据结构,由节点和边组成。每个节点包含一个值和指向子节点的引用。树的顶部节点称为根节点,没有子节点的节点称为叶节点。 树的实现方式 在JavaScript中,树可以通过…

js实现投球

js实现投球

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