NodeJS: получить файл, а не буфер - PullRequest
0 голосов
/ 26 ноября 2018

Я установил мутацию на моем apollo сервере GraphQL с graphql-upload (или apollo-upload-server) для получения файла от клиента, и теперь я пытаюсь написать тестдля этой мутации, но я не уверен, как прикрепить фактический файл к моему ложному запросу.

На моем клиенте у меня есть input type="file", и при загрузке я извлекаю файл

async upload(event) {
  const files = event.target.files || event.dataTransfer.files;
  const file = files[0]; // type of file is File
  await apollo.mutate({
    mutation: gql`
      mutation UploadFile($file: Upload) {
        uploadFile(file: $file)
      }
    `,
    variables: { file },
  })
}

Пока все хорошо.Но я также хотел бы написать тестовый пример на моем сервере.

Это моя проблема

На моем сервере я хотел бы имитировать клиента, загружающегофайл.Но я не могу найти способ доступа к реальному файлу из NodeJS.

Я пробовал:

const file = fs.readFileSync('path/to/test-file.csv');

Но fs возвращает Buffer, а невведите File, который также содержит метаданные, например, свойства mimetype, name, lastModified.

Как получить действительный File объект а не Buffer?

спасибо!

Ответы [ 3 ]

0 голосов
/ 26 ноября 2018

Вы можете установить кодировку в utf-8.

fs.readFile(path.resolve(path), { encoding: 'utf-8', flag: 'r' }, (error, data) => {

})
0 голосов
/ 02 декабря 2018

В Node.js. нет класса File.И нет ничего, что объединяет MIME-тип, содержимое файла и имя файла в объекте класса, который, как вы полагаете, существует для этой платформы.Вам придется использовать разные методы для получения всей необходимой вам информации.

  1. Существует fs.readFileSync, который возвращает вам содержимое файла из файлового дескриптора или пути к файлу.
  2. Существуют fs.lstatSync и fs.fstatSync, которые [синхронно, как и с readFileSync], дают вам некоторые требуемые атрибуты, в частности, «последнюю модифицированную метку времени» файла.

Не существует определенного приемлемого способа получения MIME-типа файла - даже если некоторые типы MIME для некоторых типов данных стандартизированы, эвристический анализ содержимого обычно применяется для определения MIME-типа файла.Например, для SVG-файла (обычно *.svg), который также является допустимым XML-файлом, вы должны убедиться, что этот файл можно проанализировать как XML, чтобы определить, что корневой элемент "svg" принадлежитПространство имен SVG, сравнивая объявленный URI пространства имен с известным пространством имен элементов SVG, и затем вы можете утверждать, что файл имеет тип image/svg+xml MIME.Такой подход - некоторый анализ фактического содержимого файла - будет применяться к любому случаю определения типа MIME, если вы хотите быть уверенным.

Теперь большинство веб-серверов просто используют расширение файла в качествеключ к карте типов MIME - например, все файлы *.gif, как говорят, имеют тип image/gif MIME, даже если в них есть мусор или простой текст.Это связано с тем, что ни веб-серверу, ни клиенту обычно не требуется эвристический анализ - если файл, который считается GIF, фактически является мусором, клиент прекратит рендеринг или отрисовку мусора, но ответственность за обеспечение правильности содержимого файла лежит.тот, кто владеет файлом, а не веб-сервером, и последний в любом случае не очень заботится о содержимом, он только обслуживает содержимое, анализируя его на самом деле не его обязанность (не для файлов «активов»)).Однако настоящей причиной является, конечно, производительность - учитывая, что эвристический анализ чаще, чем не дороже, чем просто выбор типа MIME на основе расширения файла, последний метод предпочтительнее.

0 голосов
/ 26 ноября 2018

Простой:

const file = fs.readFileSync('path/to/test-files.csv').toString();

Надеюсь, это поможет: -)

...