NodeJS: получить файл, а не буфер

Я настроил мутацию на моем сервере 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?

Спасибо!

укажите кодировку, например: fs.readFileSync('path/to/test-file.csv', 'utf8');

lependu 26.11.2018 15:18

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

nomadoda 26.11.2018 15:24
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
1 295
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Простой :

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

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

Я понимаю, что toString() возвращает буфер как отформатированную строку, но это не то, что я ищу. Насколько я знаю, буфер не содержит метаданных, только содержимое файла, и это метаданные, которые меня интересуют.

nomadoda 26.11.2018 15:23

вы можете использовать fs.stat, который выдаст вам последнее изменение, имя файла, ... См. nodejs.org/api/fs.html#fs_class_fs_stats. Для типов mime я не знаю, как вы можете это сделать ... Думаю, fs.stat будет достаточно, чтобы построить индикатор выполнения

dun32 26.11.2018 15:28

Спасибо, я разберусь, если нет лучшего варианта. Я видел библиотеки, которые могут получать mimetype, но я был бы удивлен, если бы не было возможности напрямую получить объект File.

nomadoda 26.11.2018 15:33

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

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

})

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

nomadoda 27.11.2018 09:29
Ответ принят как подходящий

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

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

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

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

Другие вопросы по теме