Как я могу записать файл в файл фильма MPEG на диск в правильном формате? - PullRequest
0 голосов
/ 04 апреля 2019

Я пытаюсь загрузить внешний файл ts (mpeg) и записать его на диск, но не могу понять, как мне правильно отформатировать содержимое файла.

Я получаю файл на диске, но он не воспроизводится в медиаплеере, и когда я просматриваю атрибуты файла, он не показывает никакой видео / звуковой информации, как это обычно делают ts-файлы.Я пробовал много разных кодировок, и я даже не стою на месте, если это является корнем проблемы, или если мне нужно как-то указать contentType, написать атрибуты файла или то, что мне здесь не хватает.

Код, который записывает невоспроизводимый файл:

getFile = (url) => {
  https.get(url, r => {
    let rawData = [];

    r.on("data", chunk => {
      rawData += chunk;
    });

    r.on("end", () => {
      fs.writeFile(`./resources/test.ts`, rawData, "utf-8", err => {
        if (err) {
          console.log(`error writing file`);
          return;
        }

        console.log(`Wrote successfully`);
      });
    });
  });
};

Для меня это совершенно новая территория.Я привык обслуживать файлы и устанавливать типы контента всех видов, а не загружать их.Буду очень признателен за помощь!

Ответы [ 2 ]

1 голос
/ 04 апреля 2019

Кодировка UTF-8 будет заполнять байты, у которых установлен старший значащий бит, что приводит к повреждению двоичных файлов.Вы можете сохранить это на диск без буферизации всех данных, вызвав res.pipe() в поток Writable, созданный fs.createWriteStream():

getFile = url =>
  https.get(url, res => {
    res.pipe(fs.createWriteStream('./resources/test.ts', 'binary'))
      .on('error', console.error)
      .on('finish', () => { console.log('wrote successfully') })
  })

Если вы хотите, чтобы вызывающий абонент мог определить, когда загрузка завершилась и произошла ли ошибка, вы можете заключить возвращаемое значение в Promise и использовать stream.finished():

const { finished } = require('stream')
const getFile = url => new Promise((resolve, reject) => {
  https.get(url, res => {
    const stream = res.pipe(
      fs.createWriteStream('./resources/test.ts', 'binary')
    )

    finished(stream, err => {
      if (err) reject(err)
      else resolve()
    })
  })
})

// usage
getFile('some url').then(() => {
  console.log('wrote successfully')
}, error => {
  console.error(error)
})
1 голос
/ 04 апреля 2019

Поскольку вы запрашиваете двоичные данные, вы должны соответствующим образом установить кодировку в ответе и при вызове writeFile. Кодировка по умолчанию - utf-8, что, вероятно, вызывает проблему здесь. Вы можете попробовать что-то вроде:

getFile = (url) => {
    https.get(url, r => {
        let rawData = '';
        r.setEncoding('binary');

        r.on('data', chunk => {
            rawData += chunk;
        });

        r.on('end', () => {
            fs.writeFile(`./resources/test.ts`, rawData, 'binary', err => {
                if (err) {
                    console.log(`error writing file`);
                    return;
                }

                console.log(`Wrote successfully`);
            });
        });
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...