元素让用户选择文件。通过JavaScript监听表单提交事件,处理…">
当前位置:首页 > JavaScript

js实现文件上传功能

2026-01-31 07:52:29JavaScript

使用HTML表单和JavaScript实现文件上传

创建一个简单的HTML表单,使用<input type="file">元素让用户选择文件。通过JavaScript监听表单提交事件,处理文件上传逻辑。

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

使用XMLHttpRequest实现文件上传

对于需要更精细控制的场景,可以使用XMLHttpRequest对象来实现文件上传,并监听上传进度。

function uploadWithXHR() {
  const fileInput = document.getElementById('fileInput');
  const file = fileInput.files[0];
  const xhr = new XMLHttpRequest();

  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);
  const formData = new FormData();
  formData.append('file', file);
  xhr.send(formData);
}

使用第三方库实现文件上传

对于更复杂的需求,可以使用第三方库如axios或Dropzone.js简化开发过程。

js实现文件上传功能

使用axios上传文件:

import axios from 'axios';

async function uploadWithAxios() {
  const fileInput = document.getElementById('fileInput');
  const file = fileInput.files[0];
  const formData = new FormData();
  formData.append('file', file);

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

实现多文件上传

支持用户一次选择多个文件并上传:

js实现文件上传功能

<input type="file" id="multiFileInput" multiple>
<button onclick="uploadMultipleFiles()">上传多个文件</button>
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', files[i]);
  }

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

文件验证和限制

在上传前对文件进行验证,包括大小、类型等限制:

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

  // 验证文件是否存在
  if (!file) {
    alert('请选择文件');
    return;
  }

  // 验证文件类型
  const allowedTypes = ['image/jpeg', 'image/png', 'application/pdf'];
  if (!allowedTypes.includes(file.type)) {
    alert('只支持JPEG, PNG和PDF文件');
    return;
  }

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

  // 验证通过,执行上传
  uploadFile(file);
}

显示上传进度和结果

为用户提供上传进度反馈和结果展示:

<div id="progressContainer" style="display: none;">
  <progress id="uploadProgress" value="0" max="100"></progress>
  <span id="progressText">0%</span>
</div>
<div id="resultContainer"></div>
function uploadWithProgress() {
  const fileInput = document.getElementById('fileInput');
  const file = fileInput.files[0];
  const progressContainer = document.getElementById('progressContainer');
  const progressBar = document.getElementById('uploadProgress');
  const progressText = document.getElementById('progressText');
  const resultContainer = document.getElementById('resultContainer');

  progressContainer.style.display = 'block';

  const xhr = new XMLHttpRequest();

  xhr.upload.addEventListener('progress', (event) => {
    if (event.lengthComputable) {
      const percent = Math.round((event.loaded / event.total) * 100);
      progressBar.value = percent;
      progressText.textContent = `${percent}%`;
    }
  });

  xhr.addEventListener('load', () => {
    resultContainer.innerHTML = '<p style="color: green;">上传成功</p>';
    progressContainer.style.display = 'none';
  });

  xhr.addEventListener('error', () => {
    resultContainer.innerHTML = '<p style="color: red;">上传失败</p>';
    progressContainer.style.display = 'none';
  });

  xhr.open('POST', '/upload', true);
  const formData = new FormData();
  formData.append('file', file);
  xhr.send(formData);
}

处理服务器响应

处理服务器返回的各种响应情况:

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

  fetch('/upload', {
    method: 'POST',
    body: file
  })
  .then(response => {
    if (!response.ok) {
      throw new Error(`HTTP错误! 状态: ${response.status}`);
    }
    return response.json();
  })
  .then(data => {
    resultContainer.innerHTML = `
      <p>上传成功!</p>
      <p>文件名: ${data.fileName}</p>
      <p>文件大小: ${data.fileSize} bytes</p>
      <p>文件URL: <a href="${data.fileUrl}" target="_blank">${data.fileUrl}</a></p>
    `;
  })
  .catch(error => {
    resultContainer.innerHTML = `<p>上传失败: ${error.message}</p>`;
  });
}

分享给朋友:

相关文章

vue实现注册功能

vue实现注册功能

前端实现注册功能 在Vue中实现注册功能通常需要结合表单验证、HTTP请求和状态管理。以下是一个基于Vue 3和Element Plus的完整实现方案: 模板部分 <template>…

php实现评论功能

php实现评论功能

数据库设计 创建评论表(示例结构): CREATE TABLE `comments` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id`…

vue拨号功能实现

vue拨号功能实现

Vue 拨号功能实现 基本思路 拨号功能通常包括数字键盘、号码显示区、拨号按钮等组件。通过Vue的数据绑定和事件处理机制,可以轻松实现交互逻辑。 实现步骤 1. 创建数字键盘组件 使用Vue的v-f…

vue实现截图功能

vue实现截图功能

Vue实现截图功能的方法 使用html2canvas库 html2canvas是一个流行的JavaScript库,可以将HTML元素转换为Canvas,进而生成图片。在Vue项目中安装html2can…

php实现分享功能实现

php实现分享功能实现

实现PHP分享功能的方法 在PHP中实现分享功能可以通过多种方式完成,以下是一些常见的实现方法: 使用社交媒体分享按钮 社交媒体平台如Facebook、Twitter、LinkedIn等提供了现成…

php实现回复功能

php实现回复功能

实现回复功能的基本步骤 在PHP中实现回复功能通常涉及数据库操作、表单处理和前后端交互。以下是实现回复功能的关键步骤: 数据库设计 创建包含回复数据的表结构,例如: CREATE TABLE re…