文件上传和处理

*** 不清楚大家对文件处理是什么感觉,反正对于我来说文件上传和后端处理开始算是个噩梦了,所以找了个机会把这个功能搞通了。 ***

前端部分

// 页面组件使用的是elementUI,开启自动上传,不允许多文件上传不显示文件列表
// 由uploadFile接管具体上传时间
<el-upload
  class="upload-demo"
  ref="upload"
  :http-request="uploadFile"
  :multiple="false"
  :auto-upload="true"
  :show-file-list="false"
>
  <el-button slot="trigger" size="small" type="primary">
    导入数据
  </el-button>
</el-upload>
// JavaScript部分
uploadFile(data) {
	// 当前上传的文件会保存在本函数的回调data.file中,将其取出
  let file = data.file; // 此处上传的是file文件即可
  // 新建一个表单向表单追加后端需要接收的文件KEY名即可
  let formData = new FormData();
  formData.append('file', file);
  // 当然这里可以追加其它东西,比如一个ID或者名称或者type等
  // 发送上传请求
  importExcel(formData)
    .then((res) => {
      // 上传后的处理
    })
    .catch(() => {
      // 上传失败处理
    });
}
// API封装,根据项目封装现状改动即可
export async function importExcel(data) {
  const res = await axios.post('/api/admin/importExcel', data);
  // 请求结束后的处理并返回promise
}

后端部分

// 后端使用的是nodejs
importExcel: async (req, res, next) => {
	// 创建一个对象用于从表单中接收数据    formidable需要npm install安装
  const form = new formidable.IncomingForm();
  // 接收表单数据    err:错误   fields:除文件外的表单数据  files:上传的文件列表
  form.parse(req, async (err, fields, files) => {
  	  // 将接收到的数据转成buffer,转成buffer一切就好操作了
    const buffer = await streamToBuffer(fs.createReadStream(files.file.path))
    // 后续对buffer的使用或者转码即可
  })
})

// 将stream转buffer
async function streamToBuffer(stream) {
    return new Promise((resolve, reject) => {
        let buffers = [];
        stream.on('error', reject);
        stream.on('data', (data) => buffers.push(data))
        stream.on('end', () => resolve(Buffer.concat(buffers)))
    });
}

Q.E.D.


远赴人间惊鸿宴,一睹人间盛世颜。