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

JS实现上传

2026-02-28 21:16:19JavaScript

上传文件的基本实现

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

<input type="file" id="fileInput">
<button onclick="uploadFile()">上传文件</button>
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));
}

多文件上传

通过添加multiple属性可以实现多文件选择:

<input type="file" id="fileInput" multiple>
function uploadFiles() {
  const fileInput = document.getElementById('fileInput');
  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', files[i]);
  }

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

上传进度显示

使用XMLHttpRequest可以获取上传进度:

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

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

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

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

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

  xhr.addEventListener('error', () => {
    console.error('上传出错');
  });

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

文件预览与验证

在上传前可以对文件进行预览和验证:

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

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

  // 验证文件类型
  const allowedTypes = ['image/jpeg', 'image/png'];
  if (!allowedTypes.includes(file.type)) {
    alert('只允许上传JPEG或PNG图片');
    return;
  }

  // 验证文件大小 (5MB以内)
  if (file.size > 5 * 1024 * 1024) {
    alert('文件大小不能超过5MB');
    return;
  }

  // 图片预览
  const reader = new FileReader();
  reader.onload = (e) => {
    const preview = document.createElement('img');
    preview.src = e.target.result;
    preview.style.maxWidth = '300px';
    document.body.appendChild(preview);
  };
  reader.readAsDataURL(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));
}

使用第三方库实现上传

对于更复杂的需求,可以使用如Dropzone.js等第三方库:

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>

<div id="myDropzone" class="dropzone"></div>
Dropzone.options.myDropzone = {
  url: "/upload",
  paramName: "file",
  maxFilesize: 5, // MB
  acceptedFiles: "image/*",
  addRemoveLinks: true,
  init: function() {
    this.on("success", function(file, response) {
      console.log("文件上传成功", response);
    });
    this.on("error", function(file, errorMessage) {
      console.error("上传出错", errorMessage);
    });
  }
};

标签: 上传JS
分享给朋友:

相关文章

vue实现上传视频

vue实现上传视频

使用 <input type="file"> 实现基础上传 通过 HTML 原生文件选择控件获取视频文件,结合 Vue 处理上传逻辑。 <template> <…

vue实现图片重新上传

vue实现图片重新上传

实现图片重新上传功能 在Vue中实现图片重新上传功能,通常涉及文件选择、预览、上传和重置等步骤。以下是一个完整的实现方案: 模板部分 <template> <div>…

vue实现列表批量上传

vue实现列表批量上传

批量上传列表的实现方法 前端部分(Vue.js) 使用<input type="file">元素配合multiple属性实现多文件选择 <template> <d…

vue实现上传头像显示

vue实现上传头像显示

Vue 实现上传头像并显示 前端实现(Vue 3 + Element Plus) 模板部分 <template> <div class="avatar-upload">…

Vue实现头像截取上传

Vue实现头像截取上传

Vue实现头像截取上传的方法 使用Vue实现头像截取上传功能,可以通过以下步骤完成。主要依赖第三方库vue-cropper或cropperjs实现图像裁剪功能,结合文件上传逻辑完成整个流程。 安装依…

react实现头像上传

react实现头像上传

实现头像上传功能 使用React实现头像上传功能需要结合文件输入、图片预览和上传逻辑。以下是一个完整的实现方案: 创建上传组件 创建一个React组件来处理头像上传功能,包含文件选择和预览功能:…