FileReader 文件读取与上传至后端 - Excel & PDF 示例

📁 FileReader 文件读取与上传至后端 - Excel & PDF 示例

📌 整理不易,收藏、点赞、关注!让你轻松读懂文件上传的完整流程!


🎯 一、教程概览

我们将通过以下几个步骤:

  1. 读取 Excel 文件:利用 FileReader 读取 Excel 文件内容,并将其显示。
  2. 读取 PDF 文件:利用 FileReader 读取 PDF 文件内容,并将其进行展示(如获取 PDF 页数等)。
  3. 上传文件至后端:将选择的文件上传至后端 API,以便保存或进一步处理。

📦 二、使用 FileReader 读取文件

1. 创建文件选择器并监听文件选择

<input type="file" id="uploadFile" />
const fileInput = document.getElementById('uploadFile')
fileInput.addEventListener('change', handleFileSelect)

function handleFileSelect(event) {
  const file = event.target.files[0]
  if (!file) return
  const reader = new FileReader()

  if (file.type === 'application/pdf') {
    // 如果是 PDF 文件
    reader.readAsArrayBuffer(file)
  } else if (file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') {
    // 如果是 Excel 文件
    reader.readAsArrayBuffer(file)
  }
}

🎯 三、读取 Excel 文件

2. 读取 Excel 文件内容

Excel 文件的读取需要借助第三方库 xlsx,你可以通过 npm 安装它:

npm install xlsx

然后,你可以使用 FileReader 将 Excel 文件读取为 ArrayBuffer,并使用 xlsx 库解析内容:

import * as XLSX from 'xlsx'

function handleFileSelect(event) {
  const file = event.target.files[0]
  if (!file) return
  const reader = new FileReader()

  reader.onload = function () {
    // 读取成功后,处理文件
    const arrayBuffer = reader.result
    const workbook = XLSX.read(arrayBuffer, { type: 'array' })

    // 获取第一个工作表的内容
    const sheetName = workbook.SheetNames[0]
    const sheet = workbook.Sheets[sheetName]
    
    // 转换为 JSON 格式
    const json = XLSX.utils.sheet_to_json(sheet)
    console.log(json) // 打印 Excel 文件内容
  }

  reader.readAsArrayBuffer(file)
}

3. 显示读取结果

在控制台中,你将看到一个包含 Excel 文件内容的数组,你可以根据自己的需求将其渲染到页面上。


🎯 四、读取 PDF 文件

4. 读取 PDF 文件内容

PDF 文件的读取稍微复杂一些,使用 pdf.js 来处理。你可以通过 npm 安装 pdf.js

npm install pdfjs-dist

然后,使用 FileReader 将 PDF 文件读取为 ArrayBuffer,并使用 pdf.js 解析文件:

import * as pdfjsLib from 'pdfjs-dist'

function handleFileSelect(event) {
  const file = event.target.files[0]
  if (!file) return
  const reader = new FileReader()

  reader.onload = function () {
    const arrayBuffer = reader.result
    pdfjsLib.getDocument(arrayBuffer).promise.then((pdf) => {
      console.log('PDF 加载成功!')

      // 获取第一页内容
      pdf.getPage(1).then((page) => {
        console.log('第一页:', page)
      })
    })
  }

  reader.readAsArrayBuffer(file)
}

这样,你就能够读取并解析 PDF 文件的内容,进而在页面上展示相关信息(如页数、文本等)。


🎯 五、将文件上传到后端

接下来,我们将文件内容上传至后端。我们可以通过 FormData 将文件作为 multipart/form-data 上传。假设后端接口为 POST /upload

5. 创建上传文件的功能

function handleFileSelect(event) {
  const file = event.target.files[0]
  if (!file) return
  const reader = new FileReader()

  reader.onload = function () {
    const arrayBuffer = reader.result

    // 发送文件至后端
    const formData = new FormData()
    formData.append('file', file)

    // 使用 Fetch API 进行文件上传
    fetch('/upload', {
      method: 'POST',
      body: formData,
    })
      .then((response) => response.json())
      .then((data) => {
        console.log('文件上传成功', data)
      })
      .catch((error) => {
        console.error('上传失败', error)
      })
  }

  reader.readAsArrayBuffer(file)
}

6. 后端代码(假设使用 Node.js 和 Express)

这是一个简单的 Node.js 后端示例,使用 multer 中间件来处理文件上传:

npm install express multer
const express = require('express')
const multer = require('multer')
const upload = multer({ dest: 'uploads/' })

const app = express()

app.post('/upload', upload.single('file'), (req, res) => {
  console.log('接收到文件:', req.file)
  res.json({ message: '文件上传成功!' })
})

app.listen(3000, () => {
  console.log('Server is running on port 3000')
})

这样,文件就可以通过 FormData 发送到后端,并通过 multer 处理上传。


🧠 六、总结与优化

总结

  • 使用 FileReader 可以方便地读取文件内容,支持多种文件格式(如 Excel、PDF)。
  • 对于 Excel 文件,使用 xlsx 库解析内容,转换为 JSON 格式,方便在前端展示。
  • 对于 PDF 文件,使用 pdf.js 库解析内容,获取页数、文本等信息。
  • 文件上传可以通过 FormData 将文件数据以 multipart/form-data 格式发送到后端。

优化建议

  1. 文件大小限制:在读取文件时可以进行文件大小的检查,避免加载过大的文件。
  2. 用户反馈:上传过程中可以显示进度条,或者在前端页面展示上传状态,提升用户体验。
  3. 文件类型校验:对于文件类型进行校验,确保用户上传的文件符合要求。
### Vue 中使用 vue-office 实现文件上传功能 在 Vue 项目中,可以通过 `vue-office` 相关组件或库实现文件上传功能,并支持多种文件格式(如 docx、excelpdf)的预览。以下是实现文件上传功能的示例教程。 #### 示例代码 以下是一个完整的 Vue 组件示例,展示如何通过 `FileReader` 和 `vue-office` 库实现文件上传和预览功能: ```vue &lt;template&gt; &lt;div&gt; &lt;input type=&quot;file&quot; @change=&quot;handleFileChange&quot; /&gt; &lt;vue-office-docx v-if=&quot;src&quot; :src=&quot;src&quot; /&gt; &lt;vue-office-excel v-if=&quot;excelSrc&quot; :src=&quot;excelSrc&quot; /&gt; &lt;vue-office-pdf v-if=&quot;pdfSrc&quot; :src=&quot;pdfSrc&quot; /&gt; &lt;/div&gt; &lt;/template&gt; &lt;script&gt; import VueOfficeDocx from &#39;@vue-office/docx&#39;; import &#39;@vue-office/docx/lib/index.css&#39;; import VueOfficeExcel from &#39;@vue-office/excel&#39;; import &#39;@vue-office/excel/lib/index.css&#39;; import VueOfficePdf from &#39;@vue-office/pdf&#39;; import &#39;@vue-office/pdf/lib/vue-office-pdf.css&#39;; export default { components: { VueOfficeDocx, VueOfficeExcel, VueOfficePdf }, data() { return { src: &#39;&#39;, // 存储 docx 文件的 ArrayBuffer excelSrc: &#39;&#39;, // 存储 Excel 文件的 ArrayBuffer pdfSrc: &#39;&#39; // 存储 PDF 文件的 ArrayBuffer }; }, methods: { handleFileChange(event) { const file = event.target.files[0]; if (!file) return; const fileReader = new FileReader(); fileReader.onload = () =&gt; { if (file.type === &#39;application/vnd.openxmlformats-officedocument.wordprocessingml.document&#39;) { this.src = fileReader.result; // 设置 docx 文件的 src } else if (file.type === &#39;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet&#39;) { this.excelSrc = fileReader.result; // 设置 Excel 文件的 src } else if (file.type === &#39;application/pdf&#39;) { this.pdfSrc = fileReader.result; // 设置 PDF 文件的 src } }; fileReader.readAsArrayBuffer(file); } } }; &lt;/script&gt; ``` #### 说明 - 使用 `&lt;input type=&quot;file&quot; /&gt;` 元素允许用户选择文件[^1]。 - 通过 `FileReader` 的 `readAsArrayBuffer` 方法读取文件内容并将其转换为 `ArrayBuffer` 格式[^1]。 - 根据文件类型动态设置对应的 `vue-office` 组件的 `src` 属性,以实现文件预览功能[^1]。 - 对于不同类型的文件(如 docx、excelpdf),分别引入对应的 `vue-office` 组件,并根据文件 MIME 类型判断加载哪个组件。 #### 注意事项 - 确保安装了 `@vue-office/docx`、`@vue-office/excel` 和 `@vue-office/pdf` 等依赖项。 - 在实际项目中,可能需要处理大文件上传问题,建议结合后端接口实现文件分片上传- 如果需要将文件上传到服务器,可以使用 `FormData` 将文件附加到请求中,并通过 AJAX 或 Axios 提交到后端。 ```javascript const formData = new FormData(); formData.append(&#39;file&#39;, file); // 将文件附加到表单数据中 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值