загрузить большие файлы и продолжить загрузку в minio с помощью nodejs, УБИЛ МОЙ СЕРВИС?

У меня есть API, созданный с помощью NodeJS, в этом API есть процесс, в котором я загружаю большой файл с использованием модулей request-promise, а затем создается новый буфер, загружаемый в minio. Но у меня есть проблема, что мой API всегда дает сбой, если размер файла превышает 80-100 МБ, а его NodeJS убит на сервере, как с этим справиться?

Эта функция предназначена для загрузки файла и преобразования его в буфер:

const convertLink = async link => {
  const options = {
    uri: link,
    encoding: null,
    headers: {
      'Content-type': 'application/octet-stream'
    }
  };
  const res = rp.get(options)
    .then((body) => {
      console.log(body)
      const a = new Buffer.from(body);
      return a;
    })
    .catch(err => {
      console.log(err)
      return err;
    });
  return res;
};

это функция для загрузки файлов в minio из miniosdk:

const streamUpload = async (bucketName, objectName, newBuffer) => {
    try {
        const isUploaded = await minioClient.putObject(bucketName, objectName, newBuffer);
        if (isUploaded) {
            return isUploaded;
        }
    } catch (err) {
        return err;
    }
};

person Aminudin    schedule 03.03.2020    source источник


Ответы (1)


Я думаю, проблема в том, что вы загружаете файл и сохраняете его в памяти, а затем загружаете в свой minioClient. что не рекомендуется для больших файлов. вы должны загрузить этот файл в виде потока, а затем также загрузить его в виде потока. Хранение больших файлов в памяти может стать причиной остановки вашего сервера node.js.

вы можете попробовать следующий пример, в котором я использую библиотеку request npm, загружаю файл и сохраняю его как поток во временное место, а затем читаю файл из этого временного места и загружаю на другой URL-адрес: -

Скачивание файла:-

const downloadFile = async (url) => {
    try {

        let tempLocation = "./temp/";
        let fileName="myfile";
        return new Promise((resolve, reject) => {
            request
                .get(url)
                .on('response', function (response) {
                     console.log(response.statusCode) // 200
                     console.log(response.headers['content-type']) 
                })
                .on('error', function (error) {
                    console.log('downloading error', error)
                    reject()
                })
                .on('end', async function () {
                    console.log("donwload finished")
                    resolve();
                })
                .pipe(fs.createWriteStream(tempLocation + '/' + fileName))
        });

    } catch (error) {
        console.log("error in downloadFile", error)
        throw error;
    }
}

теперь вы можете загрузить файл в ваш minioClient в виде потока. вы можете использовать fs.createReadStream(file) для чтения файла как потока данных из этого временного местоположения.

person Yogesh.Kathayat    schedule 03.03.2020