Rumah >hujung hadapan web >tutorial js >@ts-stack/multer memudahkan memuat naik fail ke hujung belakang berasaskan Node.js

@ts-stack/multer memudahkan memuat naik fail ke hujung belakang berasaskan Node.js

WBOY
WBOYasal
2024-07-29 15:31:24819semak imbas

@ts-stack/multer simplifies uploading files to a Node.js-based backend

Pakej ini sebenarnya merupakan garpu daripada pakej asli yang terkenal untuk ExpressJS multer v2.0.0-rc.4. Ia akan menarik terutamanya kepada pembangun yang lebih suka pengaturcaraan gaya Promise dan bukannya middleware. Selain itu, pakej ini juga penting ditulis dalam TypeScript, jadi sokongan jenis dan dokumentasi konteks di dalamnya adalah yang terbaik.

Pasang

Pastikan anda telah memasang Node.js >= v20.0.6. Pakej boleh dipasang dengan arahan berikut:

npm install @ts-stack/multer

Penggunaan

Multer mengembalikan objek dengan empat sifat: formFields, fail, fail dan kumpulan. Objek formFields mengandungi nilai medan teks borang, fail, fail atau objek kumpulan mengandungi fail (sebagai strim Boleh dibaca) yang dimuat naik melalui borang.

Contoh berikut menggunakan ExpressJS hanya untuk kesederhanaan. Malah, @ts-stack/multer tidak mengembalikan middleware, jadi ia kurang sesuai untuk ExpressJS daripada modul asal. Contoh penggunaan asas:

import { Multer } from '@ts-stack/multer';
import express from 'express';
import { createWriteStream } from 'node:fs';

// Here `avatar`, `photos` and `gallery` - is the names of the field in the HTML form.
const multer = new Multer({ limits: { fileSize: '10MB' } });
const parseAvatar = multer.single('avatar');
const parsePhotos = multer.array('photos', 12);
const parseGroups = multer.groups([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }]);
const app = express();

app.post('/profile', async (req, res, next) => {
  const parsedForm = await parseAvatar(req, req.headers);
  // parsedForm.file is the `avatar` file
  // parsedForm.formFields will hold the text fields, if there were any
  const path = `uploaded-files/${parsedForm.file.originalName}`;
  const writableStream = createWriteStream(path);
  parsedForm.file.stream.pipe(writableStream);
  // ...
});

app.post('/photos/upload', async (req, res, next) => {
  const parsedForm = await parsePhotos(req, req.headers);
  // parsedForm.files is array of `photos` files
  // parsedForm.formFields will contain the text fields, if there were any
  const promises: Promise<void>[] = [];
  parsedForm.files.forEach((file) => {
    const promise = new Promise<void>((resolve, reject) => {
      const path = `uploaded-files/${file.originalName}`;
      const writableStream = createWriteStream(path);
      file.stream.pipe(writableStream);
      writableStream.on('finish', resolve);
      writableStream.on('error', reject);
    });
    promises.push(promise);
  });

  await Promise.all(promises);
  // ...
});

app.post('/cool-profile', async (req, res, next) => {
  const parsedForm = await parseGroups(req, req.headers);
  // parsedForm.groups is an object (String -> Array) where fieldname is the key, and the value is array of files
  //
  // e.g.
  //  parsedForm.groups['avatar'][0] -> File
  //  parsedForm.groups['gallery'] -> Array
  //
  // parsedForm.formFields will contain the text fields, if there were any
});

Sekiranya anda perlu mengendalikan borang berbilang bahagian teks sahaja, anda boleh menggunakan kaedah .none(), contoh:

import { Multer } from '@ts-stack/multer';
import express from 'express';

const parseFormFields = new Multer().none();
const app = express();

app.post('/profile', async (req, res, next) => {
  const parsedForm = await parseFormFields(req, req.headers);
  // parsedForm.formFields contains the text fields
});

Ralat pengendalian

Ini ialah senarai kod ralat:

const errorMessages = new Map<ErrorMessageCode, string>([
  ['CLIENT_ABORTED', 'Client aborted'],
  ['LIMIT_FILE_SIZE', 'File too large'],
  ['LIMIT_FILE_COUNT', 'Too many files'],
  ['LIMIT_FIELD_KEY', 'Field name too long'],
  ['LIMIT_FIELD_VALUE', 'Field value too long'],
  ['LIMIT_FIELD_COUNT', 'Too many fields'],
  ['LIMIT_UNEXPECTED_FILE', 'Unexpected file field'],
]);

Anda boleh melihat kod ralat ini dalam sifat MulterError#code:

import { Multer, MulterError, ErrorMessageCode } from '@ts-stack/multer';

// ...
try {
  const multer = new Multer().single('avatar');
  const parsedForm = await multer(req, req.headers);
  // ...
} catch (err) {
  if (err instanceof MulterError) {
    err.code // This property is of type ErrorMessageCode.
    // ...
  }
}

Atas ialah kandungan terperinci @ts-stack/multer memudahkan memuat naik fail ke hujung belakang berasaskan Node.js. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn