元素配合JavaScript的FormData对象实现基础文件上传。
当前位置:首页 > JavaScript

js 实现文件上传

2026-02-28 22:38:01JavaScript

文件上传的基本实现

使用HTML的<input type="file">元素配合JavaScript的FormData对象实现基础文件上传。

<input type="file" id="fileInput">
<button onclick="uploadFile()">上传</button>

<script>
function uploadFile() {
  const fileInput = document.getElementById('fileInput');
  const file = fileInput.files[0];

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

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

多文件上传处理

通过设置multiple属性允许选择多个文件,使用循环处理文件列表。

js 实现文件上传

<input type="file" id="multiFileInput" multiple>
<button onclick="uploadMultipleFiles()">批量上传</button>

<script>
function uploadMultipleFiles() {
  const fileInput = document.getElementById('multiFileInput');
  const files = fileInput.files;

  if (files.length === 0) {
    alert('请选择文件');
    return;
  }

  const formData = new FormData();
  for (let i = 0; i < files.length; i++) {
    formData.append(`files_${i}`, files[i]);
  }

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

上传进度监控

利用XMLHttpRequest对象的upload事件监听上传进度。

function uploadWithProgress(file) {
  const xhr = new XMLHttpRequest();
  xhr.open('POST', '/upload');

  xhr.upload.onprogress = function(e) {
    if (e.lengthComputable) {
      const percent = Math.round((e.loaded / e.total) * 100);
      console.log(`上传进度: ${percent}%`);
    }
  };

  xhr.onload = function() {
    console.log('上传完成');
  };

  const formData = new FormData();
  formData.append('file', file);
  xhr.send(formData);
}

文件类型和大小验证

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

js 实现文件上传

function validateAndUpload(file) {
  // 允许的文件类型
  const allowedTypes = ['image/jpeg', 'image/png'];
  // 最大5MB
  const maxSize = 5 * 1024 * 1024;

  if (!allowedTypes.includes(file.type)) {
    alert('仅支持JPEG和PNG格式');
    return;
  }

  if (file.size > maxSize) {
    alert('文件大小不能超过5MB');
    return;
  }

  // 验证通过后上传
  uploadFile(file);
}

拖放上传实现

通过监听拖放事件实现拖拽上传功能。

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

<script>
const dropZone = document.getElementById('dropZone');

dropZone.addEventListener('dragover', (e) => {
  e.preventDefault();
  dropZone.style.borderColor = 'blue';
});

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

dropZone.addEventListener('drop', (e) => {
  e.preventDefault();
  dropZone.style.borderColor = '#ccc';

  const files = e.dataTransfer.files;
  if (files.length > 0) {
    uploadFile(files[0]);
  }
});
</script>

使用第三方库实现

利用如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>

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

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

相关文章

js实现验证码

js实现验证码

实现验证码的JavaScript方法 生成随机验证码 使用Math.random()生成随机字符串,结合数字和字母: function generateCaptcha() { const cha…

js实现vue

js实现vue

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

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div cl…

js 实现倒计时

js 实现倒计时

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

js防抖和节流实现

js防抖和节流实现

防抖(Debounce)的实现 防抖的核心思想是在事件被触发后,延迟执行回调函数。如果在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口大小调整等场景。 function debounce…

vue 实现文件上传

vue 实现文件上传

Vue 文件上传实现方法 使用原生 input 元素 创建一个文件上传表单,通过 @change 事件获取文件对象 <template> <input type="file"…