元素配合JavaScript的File API可以实现文件上传功能。
当前位置:首页 > JavaScript

js实现上传文件

2026-01-15 14:52:47JavaScript

文件上传的基本实现

使用HTML的<input type="file">元素配合JavaScript的File API可以实现文件上传功能。

<input type="file" id="fileInput">
<button id="uploadButton">上传文件</button>
document.getElementById('uploadButton').addEventListener('click', function() {
  const fileInput = document.getElementById('fileInput');
  const file = fileInput.files[0];

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

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

多文件上传实现

通过添加multiple属性允许选择多个文件,并遍历文件列表进行上传。

<input type="file" id="multiFileInput" multiple>
document.getElementById('uploadButton').addEventListener('click', function() {
  const fileInput = document.getElementById('multiFileInput');
  const files = fileInput.files;

  if (files.length > 0) {
    const formData = new FormData();

    for (let i = 0; i < files.length; i++) {
      formData.append('files[]', files[i]);
    }

    fetch('/multi-upload', {
      method: 'POST',
      body: formData
    })
    .then(/* 处理响应 */);
  }
});

上传进度监控

使用XMLHttpRequest可以监控文件上传进度。

js实现上传文件

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

  xhr.upload.addEventListener('progress', function(e) {
    if (e.lengthComputable) {
      const percentComplete = (e.loaded / e.total) * 100;
      console.log(`上传进度: ${percentComplete}%`);
    }
  });

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

文件类型和大小验证

在上传前对文件进行验证。

const MAX_SIZE = 10 * 1024 * 1024; // 10MB
const ALLOWED_TYPES = ['image/jpeg', 'image/png'];

function validateFile(file) {
  if (!ALLOWED_TYPES.includes(file.type)) {
    alert('不支持的文件类型');
    return false;
  }

  if (file.size > MAX_SIZE) {
    alert('文件大小超过限制');
    return false;
  }

  return true;
}

拖放上传实现

通过监听拖放事件实现更友好的上传体验。

js实现上传文件

<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 = 'blue';
}

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) {
    // 处理上传
  }
}

文件预览实现

在上传前显示文件预览。

function showPreview(file) {
  const preview = document.getElementById('preview');

  if (file.type.startsWith('image/')) {
    const reader = new FileReader();
    reader.onload = function(e) {
      preview.innerHTML = `<img src="${e.target.result}" style="max-width: 200px;">`;
    };
    reader.readAsDataURL(file);
  } else {
    preview.textContent = `文件名: ${file.name}`;
  }
}

分片上传实现

对于大文件,可以采用分片上传策略。

function uploadInChunks(file, chunkSize = 1024 * 1024) {
  const totalChunks = Math.ceil(file.size / chunkSize);
  let chunkNumber = 0;

  function uploadChunk() {
    const start = chunkNumber * chunkSize;
    const end = Math.min(start + chunkSize, file.size);
    const chunk = file.slice(start, end);

    const formData = new FormData();
    formData.append('chunk', chunk);
    formData.append('chunkNumber', chunkNumber);
    formData.append('totalChunks', totalChunks);
    formData.append('filename', file.name);

    return fetch('/upload-chunk', {
      method: 'POST',
      body: formData
    })
    .then(response => {
      chunkNumber++;
      if (chunkNumber < totalChunks) {
        return uploadChunk();
      }
      return response.json();
    });
  }

  return uploadChunk();
}

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

相关文章

vue实现压缩上传文件

vue实现压缩上传文件

压缩上传文件的实现方法 在Vue中实现文件压缩并上传可以通过以下步骤完成: 安装依赖 需要安装compressorjs库处理文件压缩: npm install compressorjs 组件代码示…

js实现验证

js实现验证

验证表单输入 使用JavaScript验证表单输入是常见的需求。可以通过监听表单提交事件,检查输入字段是否符合要求。 document.getElementById('myForm').addEve…

js jquery

js jquery

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够…

实现继承js

实现继承js

实现继承的方式 在JavaScript中,实现继承可以通过多种方式完成,每种方式都有其优缺点。以下是几种常见的实现继承的方法: 原型链继承 原型链继承是最基本的继承方式,通过将子类的原型指向父类的实…

js 实现日历

js 实现日历

实现日历的基本思路 日历的核心功能是展示日期,并允许用户进行日期选择或导航。JavaScript 可以动态生成日历的 HTML 结构,并处理用户交互逻辑。 基础日历结构 日历通常包含头部(显示月份和…

js实现截图

js实现截图

使用HTML2Canvas库实现截图 HTML2Canvas是一个流行的JavaScript库,可以将网页元素或整个页面转换为Canvas图像。安装方式: npm install html2canv…