首页 > 解决方案 > 无法在 setTimeout 中向服务器发送流

问题描述

我一直在尝试将图像文件流(使用 createReadStream)上传到服务器(使用 Multer)。

我正在使用请求模块。

第一次发送请求时,一切正常。服务器接收流,对其进行处理并将其保存到文件中。

几秒钟后(使用 setTimeout),相同的文件流再次发送到服务器,但 multer 既没有运行,客户端也没有收到任何响应。它一直在等待。

我在使用流时发现了该文件流。但是,我已将 autoClose 设置为 false。仍然没有运气。

我也尝试将流保存在缓冲区中,然后将缓冲区上传到服务器但 multer 无法处理它,我得到一个空的 req.files 对象。

如果你能帮助我或给我一个方向,我将不胜感激。一个多星期以来,我一直在努力解决这个问题。

let formData = {};
formData.imageFile = fs.createReadStream('./file.jpg', { autoClose: false });

request.post({ url: config.uploadURL, formData }, (err, response, body) => {
      if (err) {
        return console.error('upload failed:', err);
      }
      console.log('Received response');
    });

setTimeout(() => {

    request.post({ url: config.uploadURL, formData}, (err, response, body) => {
      if (err) {
        return console.error('upload failed:', err);
      }
      console.log('Received response');
    });
  }, 10000);

第一个请求完美运行。第二个没有。

标签: node.jsstreamrequestfsmulter

解决方案


这将起作用,实际上我们正在重新打开流。

const request = require('request');
const fs = require('fs');

function getFileStream(fileName) {
    return fs.createReadStream(fileName, { autoClose: true });
}

let formData = { imageFile: getFileStream('./file.jpg') };

console.log('Uploading..');
request.post({ url: config.uploadURL, formData }, (err, response, body) => {
      if (err) {
        return console.error('upload failed:', err);
      }
      console.log('Received response');
    });

setTimeout(() => {
    console.log('Uploading again..');
    formData = { imageFile: getFileStream('./file.jpg') };
    request.post({ url: config.uploadURL, formData}, (err, response, body) => {
      if (err) {
        return console.error('upload failed:', err);
      }
      console.log('Received response');
    });
  }, 10000);

您也可以只将文件加载到内存中,完全避免使用流:

const request = require('request');
const fs = require('fs');

let formData = {
    imageFile: {
        value:  fs.readFileSync('./file.jpg'),
        options: {
          filename: 'file.jpg',
          contentType: 'image/jpeg'
        }
    }
};

console.log('Uploading..');
request.post({ url: config.uploadURL, formData }, (err, response, body) => {
      if (err) {
        return console.error('upload failed:', err);
      }
      console.log('Received response');
    });

setTimeout(() => {
    console.log('Uploading again..');
    request.post({ url: config.uploadURL, formData}, (err, response, body) => {
      if (err) {
        return console.error('upload failed:', err);
      }
      console.log('Received response');
    });
  }, 10000);

推荐阅读