1

Тема: Не можу зрозуміти як конвертувати File що приходить з клієнта в буфер

Я надсилаю з клієнта файл, витягую з запита в контроллері і передаю в функцію

const md5 = require('md5')
const fs = require('fs')
const path = require('path')

const cfg = {
  sizeLimit: 100 * 1000 * 1000,
}

const getHash = (file) => {
  const date = new Date()
  return md5(`${file.name}-${date.toString()}`)
}

const getExt = (file) => {
  return file.name.split('.')[file.name.split('.').length - 1]
}

const verifySize = (file) => {
  if (file.size > cfg.sizeLimit) {
    return { error: true, textUk: 'Надто великий файл' }
  }
}

const verifyExt = (file) => {
  const extListString = 'jpg,jpeg,png,webp,webm,mp4,doc,txt,pdf'
  const extList = extListString.split(',')
  const ext = getExt(file)
  if (extList.includes(ext)) {
    return { error: true, textUk: `Формат файлу .${ext} не підтримується. Дозволені формати - ${extListString}` }
  }
}

const uploadDir = '../public/files';
console.log(uploadDir)

module.exports = (file) => {
  verifySize(file)
  verifyExt(file)

  return new Promise((resolve, reject) => {
    const hash = getHash(file)
    const ext = getExt(file)
    console.log(hash, ext)
    console.log(file)
    fs.writeFile(
      uploadDir + `/${hash}.${ext}`,
      file,
      err => {
        if (err) {
          return reject(err)
        }
        resolve({
          url: `/files/${hash}.${ext}`
        })
      }
    )
  })
}

Приходить в функцію такий об'єкт

File {
  _events: [Object: null prototype] {},
  _eventsCount: 0,
  _maxListeners: undefined,
  size: 33311,
  path: 'C:\\Users\\shtye\\AppData\\Local\\Temp\\upload_777afc98ac96b2603f472c6f91d1260a',
  name: 'photo_2021-04-01_21-46-42.jpg',
  type: 'image/jpeg',
  hash: null,
...

Проблема виникає на етапі fs.writeFile

error TypeError [ERR_INVALID_ARG_TYPE]: The "data" argument must be of type string or an instance of Buffer, TypedArray, or DataView. Received an instance of File
    at Object.writeFile (fs.js:1487:5)

Я розумію що об'єкт File треба якось перетворити в Buffer. Пробував Buffer.from(file) але виникає помилка в buffer.

Не особливо розумію як ці об'єкти працюють
Помилка напевно в чомусь дуже тупому але через малий досвід роботи з файлами не можу знайти свою хибу.

Буду дуже вдячний за допомогу

Подякували: 0xDADA11C71

2

Re: Не можу зрозуміти як конвертувати File що приходить з клієнта в буфер

воно ж ніби автоматично то зберігає, і ось це

path: 'C:\\Users\\shtye\\AppData\\Local\\Temp\\upload_777afc98ac96b2603f472c6f91d1260a',

показує, куди воно зберегло той файл. Тобто, вам потім його треба просто зкопіювати в потрібне місце.

Подякували: koala, shtyegor2