nodejs转发前端文件到后端

【前端上传文件】

示例:vue+elementUI的上传组件

<el-upload
  :auto-upload="false"
  :on-change="uploadFile"
  name="file">
  <el-button slot="trigger" size="small" type="primary">选取文件</el-button>
</el-upload>
import axios from 'axios';
const url = 'fileUpload';
async uploadFile(file) {
  const formData = new FormData()
  formData.append('file', file.raw)
  const res = await fileUpload(formData)
  console.log(res)
}

function fileUpload(params = {}) {
  const otherOptions = {
    headers: { 'Content-Type': 'multipart/form-data' }
  }
  return axios.post(url, params, otherOptions)
}

【node端转发】

示例:node + egg

在config.default.js中配置multipart

config.multipart = {
  mode: 'file',
  fileExtensions: ['.xlsx', '.xls', '.pdf', '.doc', '.docx']
};
  import axios from 'axios';
  const { ctx, config: uploadUrl} = this;
  const files = ctx.request.files; // files[0]表示获取第一个文件
  const file = files[0];
  const formData = new FormData();
  if (file) {
    // 读取文件
    // const fileStream = fs.readFileSync(file.filepath) 
    const fileStream = fs.createReadStream(file.filepath);
    const name = file.filename;
    formData.append(file.field, fileStream, {
      filename: name,
      header: `--${formData.getBoundary()}\r\nContent-Disposition: form-data; name="${file.field}"; filename=${name}\r\nContent-Type: octet-stream\r\n\r\n`,
    });
  }
   
  axios.post(uploadUrl, formData, {
    headers: {
      'content-type': 'multipart/form-data; boundary=' + formData.getBoundary()
    }
  }).then(res => {
    console.log(res)
  })

【测试用例】

mocha + suppertest

import mock from 'egg-mock';
import assert = require('assert');
describe('模块名称', () => {
  let app;
  before(() => {
    app = mock.app({
      baseDir: 'xxxx',
    });
    return app.ready();
  });

  after(() => app.close());
  afterEach(mock.restore);
  
  describe('test file Upload', () => {
    it('should GET file Upload result', async () => {
      /* 测试上传文件 */
        const filename = 'xxx.pdf';
        return await app.httpRequest()
          .post(`${routerPrefix}/vMail/uploadAttachment`)
          .field('name', 'file')
          .attach('file', 'test/'+ filename)
          .expect('Content-Type', /json/)
           expect(200);
    });
  });

});

参考文档:

Egg 单元测试_w3cschool为什么要单元测试先问我们自己以下几个问题:你的代码质量如何度量?你是如何保证代码质量?你敢随时重构代码吗?你是如何确保重构的代码依然保持正确性?你是否有足够信心在没有测试的情况下随时发布你的代码?如果答案都比较犹豫,那么就证明我们非常需要单元测试。它能带给我们很多保障:代码质量持续有保障重构正确性保_来自企业级 Node.js 框架 egg,w3cschool编程狮。https://www.w3cschool.cn/eggjslesson/eggjslesson-vkm535yp.htmlGitHub - visionmedia/supertest: 🕷 Super-agent driven library for testing node.js HTTP servers using a fluent API.https://github.com/visionmedia/supertest#getting-started

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值