Получение ERR_FS_FILE_TOO_LARGE при использовании unirest файла, отправленного с помощью put - PullRequest
6 голосов
/ 10 июля 2020

Я использую unirest для загрузки такого файла

 unirest.put(fullUri)
    .auth({
      user: self.userName,
      pass: self.password
    })
    .header('X-Checksum-Sha1', sha1Hash)
    .header('X-Checksum-Md5', md5Hash)
    .send(fs.readFileSync(filePath))
    .end(function (response) {

Это отлично работает для небольших файлов, но для больших файлов я получаю ошибку ERR_FS_FILE_TOO_LARGE. Я уже пробовал max_old_space_size безуспешно. Похоже, я могу исправить это путем потоковой передачи файла, но я не могу найти API для этого в библиотеке unirest js.

Ответы [ 3 ]

3 голосов
/ 13 июля 2020

Похоже, это проблема с form-data From GitHub Issues

Оказывается, что unirest используют модуль NPM form-data, а модуль form-data требует, чтобы, если он получил поток, отличный от fs.ReadStream, нам нужно было предоставить информацию о файле с помощью дополнительных.

Пример:

form.append( 
  'my_file', 
  stream,
  {
    filename: 'bar.jpg', 
    contentType: 'image/jpeg', 
    knownLength: 19806,
  },
)

См .: https://github.com/form-data/form-data#void -append-string-field-mixed-value - mixed-options-

0 голосов
/ 17 июля 2020

Я не могу найти API для этого в unirest js библиотеке.

Это потому, что его нет: https://github.com/Kong/unirest-nodejs/issues/49 :

  • Вы можете использовать базовую библиотеку запросов для потоковой передачи, Я открыт для запроса на вытягивание либо в этой ветке или версию 1.0 для добавления потоковой передачи.

Проблема все еще открыта.

Но из этого выпуска и из исходного кода вы можете узнать, что end() возвращает request (см. https://github.com/request/request )

Unirest.request = require('request')

...

  end: function (callback) {
    ...
    Request = Unirest.request($this.options, handleRequestResponse)
    Request.on('response', handleGZIPResponse)
    ...
    return Request
  }

и из исходного кода request вы можете узнать, что фактический запрос еще не отправлен (он отложен). Так что вы можете взломать его. И вместо этого используйте его API:

const request = unirest.put(constants.server2)
  .auth({
    user: self.userName,
    pass: self.password
  })
  .header('X-Checksum-Sha1', sha1Hash)
  .header('X-Checksum-Md5', md5Hash)
  // .send(fs.readFileSync(filePath))
  .end(...)

fs.createReadStream(filePath).pipe(request) // just pipe it!

В качестве примечания: unirest основан на запросе , запрос теперь не рекомендуется . Итак ... может быть, вам нужно держаться подальше от unirest .

0 голосов
/ 14 июля 2020

Потоковые файлы с unirest доступны с помощью метода .attach:

 unirest.put(fullUri)
    .auth({
      user: self.userName,
      pass: self.password
    })
    .header('X-Checksum-Sha1', sha1Hash)
    .header('X-Checksum-Md5', md5Hash)
//    .send(fs.readFileSync(filePath))
    .attach('filename', fs.createReadStream(filePath))
    .end(function (response) {
...