Не удается отправить поток на сервер в setTimeout - PullRequest
0 голосов
/ 25 июня 2018

Я пытался загрузить поток файлов изображений (используя createReadStream) на сервер (используя Multer).

Я использую модуль запроса.

Когда отправляется запроспервый раз все отлично работает.Сервер получает поток, обрабатывает его и сохраняет его в файл.

Через несколько секунд (используя setTimeout) тот же файловый поток снова отправляется на сервер, но ни мультипер не запускается, ни клиент не получает никакихответ.Он продолжает ждать.

Я нашел этот поток файлов, когда поток используется.Но я установил для 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);

Первый запрос работает отлично.Второго нет.

1 Ответ

0 голосов
/ 25 июня 2018

Это будет работать, по сути, мы снова открываем поток.

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);
...