客户端上传文件,node层做转发

287 阅读1分钟
const FormData = require("form-data");const axios = require('axios')
const decodeContent = content => {
      let lines = content.split('\n');
      const findFlagNo = (arr, flag) => arr.findIndex(o => o.includes(flag));      
      // 查找 ----- Content-Disposition Content-Type 位置并且删除 
      const startNo = findFlagNo(lines, '------');
      lines.splice(startNo, 1);
      const ContentDispositionNo = findFlagNo(lines, 'Content-Disposition');
      lines.splice(ContentDispositionNo, 1);
      const ContentTypeNo = findFlagNo(lines, 'Content-Type');
      lines.splice(ContentTypeNo, 1);
      // 最后的 ----- 要在数组末往前找
      const endNo = lines.length - findFlagNo(lines.reverse(), '------') - 1;
      // 先反转回来
      lines.reverse().splice(endNo, 1);
      return Buffer.from(lines.join('\n'));

}
const arr = []        
req.on('data', (buffer) => {
         arr.push(buffer);
})
req.on('end', async () => {
     let buffer = Buffer.concat(arr);
     const content = buffer.toString();
     const result = decodeContent(content);
     const fileName = content.match(/(?<=filename=").*?(?=")/)[0];
     const fileContent = Buffer.from(result);
     let formData = new FormData();
     formData.append('file', fileContent, {
         filename: fileName,
         contentType: 'text/plain',
         knownLength: fileContent.byteLength
     });     
     formData.append('filename', fileName);
     let headers = formData.getHeaders();

     const uploadfile = await axios({
            method: "post",
            url: "url",
            data: formData,
            headers      
      }).then(data => data.data || {})
      res.writeHead(200, { 'Content-Type': 'application/json' });
      res.end(JSON.stringify(uploadfile))
})