…">
当前位置:首页 > JavaScript

js实现上传文件

2026-02-28 21:17:57JavaScript

使用input元素上传文件

在HTML中创建一个类型为file的input元素,用户可通过点击按钮选择文件:

<input type="file" id="fileInput" />

通过JavaScript获取文件对象:

const fileInput = document.getElementById('fileInput');
fileInput.addEventListener('change', (event) => {
  const file = event.target.files[0];
  console.log('Selected file:', file.name, file.size, file.type);
});

通过FormData上传文件

使用FormData对象构建表单数据,适合通过AJAX上传:

const formData = new FormData();
formData.append('file', fileInput.files[0]);

fetch('/upload', {
  method: 'POST',
  body: formData
})
.then(response => response.json())
.then(data => console.log('Upload success:', data))
.catch(error => console.error('Error:', error));

拖放文件上传

实现拖放区域接收文件:

<div id="dropArea" style="border: 2px dashed #ccc; padding: 20px;">
  拖放文件到此处
</div>

JavaScript处理拖放事件:

const dropArea = document.getElementById('dropArea');

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

dropArea.addEventListener('drop', (e) => {
  e.preventDefault();
  dropArea.style.borderColor = '#ccc';
  const files = e.dataTransfer.files;
  if(files.length) {
    console.log('Dropped file:', files[0].name);
  }
});

文件预览与验证

预览图片文件:

const preview = document.getElementById('preview');
const reader = new FileReader();

reader.onload = (e) => {
  preview.src = e.target.result;
};
reader.readAsDataURL(fileInput.files[0]);

验证文件类型和大小:

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

if(!ALLOWED_TYPES.includes(file.type)) {
  alert('仅支持JPEG/PNG格式');
  return;
}
if(file.size > MAX_SIZE) {
  alert('文件大小不能超过5MB');
  return;
}

分片上传大文件

实现文件分片上传:

const CHUNK_SIZE = 1 * 1024 * 1024; // 1MB
let offset = 0;

function uploadChunk(file, chunk) {
  const formData = new FormData();
  formData.append('chunk', chunk);
  formData.append('offset', offset);
  formData.append('fileId', Date.now());

  return fetch('/upload-chunk', {
    method: 'POST',
    body: formData
  });
}

while(offset < file.size) {
  const chunk = file.slice(offset, offset + CHUNK_SIZE);
  await uploadChunk(file, chunk);
  offset += CHUNK_SIZE;
}

进度监控

显示上传进度:

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

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

浏览器兼容性处理

对于不支持FormData的旧浏览器:

if(window.FormData) {
  // 使用FormData上传
} else {
  // 使用iframe或base64编码方式
  const reader = new FileReader();
  reader.readAsDataURL(file);
  reader.onload = () => {
    const base64Data = reader.result.split(',')[1];
    // 发送base64数据
  };
}

js实现上传文件

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

相关文章

js实现分页

js实现分页

实现分页的基本思路 分页功能通常需要处理数据分割、页码生成和用户交互。核心逻辑包括计算总页数、根据当前页截取数据、渲染页码按钮等。 前端分页实现(静态数据) 假设已有全部数据,仅需前端分页展示:…

css3结合js制作

css3结合js制作

CSS3 结合 JavaScript 制作动态效果 CSS3 和 JavaScript 结合可以实现丰富的动态效果,包括动画、交互和响应式设计。以下是几种常见的实现方式: CSS3 动画与 Jav…

vue实现压缩上传文件

vue实现压缩上传文件

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

js实现复制

js实现复制

使用document.execCommand方法 在较旧的浏览器中,可以使用document.execCommand('copy')实现复制功能。创建一个临时的textarea或input元素,将需要…

js实现打印

js实现打印

使用window.print()方法实现打印 在JavaScript中,可以通过调用window.print()方法直接触发浏览器的打印功能。这会打开系统的打印对话框,用户可以选择打印机和设置打印选项…

js实现验证

js实现验证

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