元素获取用户选择的文件,通过FileReader对象读取文件内容: const fileInput = document.get…">
当前位置:首页 > JavaScript

js实现文件

2026-01-31 17:14:20JavaScript

文件上传与读取

使用<input type="file">元素获取用户选择的文件,通过FileReader对象读取文件内容:

const fileInput = document.getElementById('fileInput');
fileInput.addEventListener('change', (event) => {
  const file = event.target.files[0];
  const reader = new FileReader();

  reader.onload = (e) => {
    const content = e.target.result;
    console.log(content);
  };

  reader.readAsText(file); // 其他方法:readAsArrayBuffer, readAsDataURL
});

文件下载

通过创建Blob对象和URL对象实现文件下载:

function downloadFile(content, fileName, mimeType) {
  const blob = new Blob([content], { type: mimeType });
  const url = URL.createObjectURL(blob);

  const a = document.createElement('a');
  a.href = url;
  a.download = fileName;
  document.body.appendChild(a);
  a.click();

  setTimeout(() => {
    document.body.removeChild(a);
    URL.revokeObjectURL(url);
  }, 100);
}

// 使用示例
downloadFile('Hello World', 'test.txt', 'text/plain');

文件切片上传

对于大文件可采用分片上传策略:

js实现文件

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

  for (let i = 0; i < totalChunks; i++) {
    const start = i * 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('chunkIndex', i);
    formData.append('totalChunks', totalChunks);
    formData.append('fileName', file.name);

    await fetch('/upload', {
      method: 'POST',
      body: formData
    });
  }
}

文件拖放功能

实现拖放区域接收文件:

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

dropArea.addEventListener('dragover', (e) => {
  e.preventDefault();
  dropArea.classList.add('dragover');
});

dropArea.addEventListener('dragleave', () => {
  dropArea.classList.remove('dragover');
});

dropArea.addEventListener('drop', (e) => {
  e.preventDefault();
  dropArea.classList.remove('dragover');

  const files = e.dataTransfer.files;
  if (files.length) {
    handleFiles(files);
  }
});

文件类型验证

验证文件扩展名和MIME类型:

js实现文件

function validateFile(file, allowedTypes) {
  const extension = file.name.split('.').pop().toLowerCase();
  const isValidExtension = allowedTypes.extensions.includes(extension);
  const isValidMime = allowedTypes.mimeTypes.includes(file.type);

  return isValidExtension && isValidMime;
}

// 使用示例
const valid = validateFile(file, {
  extensions: ['jpg', 'png'],
  mimeTypes: ['image/jpeg', 'image/png']
});

文件压缩

使用第三方库如compressor.js实现图片压缩:

new Compressor(file, {
  quality: 0.8,
  maxWidth: 800,
  success(result) {
    const compressedFile = new File([result], file.name, {
      type: result.type
    });
    // 处理压缩后的文件
  },
  error(err) {
    console.error(err.message);
  }
});

文件预览

实现图片/PDF等文件的预览功能:

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

  if (file.type.startsWith('image/')) {
    const img = document.createElement('img');
    img.src = URL.createObjectURL(file);
    preview.appendChild(img);
  } else if (file.type === 'application/pdf') {
    // 使用PDF.js等库处理PDF预览
  }
}

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

相关文章

js分组实现

js分组实现

分组实现方法 在JavaScript中,可以通过多种方式实现数组或对象的分组操作。以下是几种常见的方法: 使用Array.prototype.reduce() 通过reduce方法可以轻松实现数组分…

js实现图表

js实现图表

在JavaScript中实现图表通常使用流行的图表库,以下是几种常见的方法和工具: 使用Chart.js Chart.js是一个简单灵活的库,适合快速生成响应式图表。安装方式包括CDN引入或npm安…

js实现tab选项卡切换

js实现tab选项卡切换

实现Tab选项卡切换的JavaScript方法 使用纯JavaScript实现Tab切换功能,可以通过监听点击事件动态切换内容显示状态。以下是两种常见实现方式: 基础DOM操作实现 // 获取所有…

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…

js实现投球

js实现投球

实现投球动画的基本思路 使用JavaScript和CSS动画结合的方式模拟投球效果。核心是通过改变元素的位置、旋转和缩放属性,配合定时器或CSS过渡实现平滑动画。 创建基础HTML结构 <di…

vue 实现文件目录

vue 实现文件目录

Vue 实现文件目录结构 Vue 项目通常采用模块化设计,合理的目录结构有助于代码维护和团队协作。以下是常见的 Vue 项目目录结构及说明: 基础目录结构(基于 Vue CLI 生成) proje…