logo
eng-flag

Node.js için Formidable Cheatsheet

Formidable, özellikle dosya yüklemeleri olmak üzere form verilerini ayrıştırmak için kullanılan güçlü bir Node.js modülüdür. Bu cheatsheet, Formidable'ın özelliklerini, kullanımını ve en iyi uygulamalarını kapsamlı bir şekilde ele almaktadır.

İçindekiler

  1. Kurulum
  2. Temel Kullanım
  3. Ayrıştırma Seçenekleri
  4. Dosya Yüklemeleri
  5. Çoklu Dosya İşleme
  6. Özel Dosya Adları
  7. İlerleme Takibi
  8. Hata Yönetimi
  9. Alanlarla Çalışma
  10. JSON Ayrıştırma
  11. Express ile Kullanım
  12. Dosya Akışı
  13. Güvenlik Önlemleri
  14. Test Etme

Kurulum

Formidable'ı npm kullanarak yükleyin:

npm install formidable

Temel Kullanım

İşte bir Node.js uygulamasında Formidable'ın basit bir kullanım örneği:

const http = require('http');
const formidable = require('formidable');

http.createServer((req, res) => {
  if (req.url === '/api/upload' && req.method.toLowerCase() === 'post') {
    // Dosya yüklemesini ayrıştır
    const form = formidable({ multiples: true });

    form.parse(req, (err, fields, files) => {
      if (err) {
        res.writeHead(err.httpCode || 400, { 'Content-Type': 'text/plain' });
        res.end(String(err));
        return;
      }
      res.writeHead(200, { 'Content-Type': 'application/json' });
      res.end(JSON.stringify({ fields, files }, null, 2));
    });

    return;
  }

  // Dosya yükleme formu göster
  res.writeHead(200, { 'Content-Type': 'text/html' });
  res.end(`
    <h2>Node.js <code>"http"</code> modülü ile</h2>
    <form action="/api/upload" enctype="multipart/form-data" method="post">
      <div>Metin alanı başlığı: <input type="text" name="title" /></div>
      <div>Dosya: <input type="file" name="cokluDosyalar" multiple="multiple" /></div>
      <input type="submit" value="Yükle" />
    </form>
  `);
}).listen(8080);

Ayrıştırma Seçenekleri

Formidable çeşitli ayrıştırma seçeneklerini destekler:

const form = formidable({
  multiples: true,
  uploadDir: '/tmp',
  keepExtensions: true,
  maxFileSize: 200 * 1024 * 1024, // 200MB
  filter: function ({ name, originalFilename, mimetype }) {
    // sadece resimleri tut
    return mimetype && mimetype.includes("image");
  }
});

Dosya Yüklemeleri

Dosya yüklemelerini kolayca işleyin:

const form = formidable({ uploadDir: '/tmp', keepExtensions: true });

form.parse(req, (err, fields, files) => {
  if (err) {
    console.error('Hata', err);
    throw err;
  }
  console.log('Alanlar', fields);
  console.log('Dosyalar', files);
});

Çoklu Dosya İşleme

Çoklu dosya yüklemeleriyle çalışın:

const form = formidable({ multiples: true });

form.parse(req, (err, fields, files) => {
  if (err) {
    console.error('Hata', err);
    throw err;
  }
  
  if (Array.isArray(files.upload)) {
    // Çoklu dosyalar
    files.upload.forEach(file => {
      console.log('Yüklenen dosya:', file.originalFilename);
    });
  } else {
    // Tek dosya
    console.log('Yüklenen dosya:', files.upload.originalFilename);
  }
});

Özel Dosya Adları

Yüklenen dosya adlarını özelleştirin:

const form = formidable({
  uploadDir: '/tmp',
  keepExtensions: true,
  filename: (name, ext, part, form) => {
    return 'dosya_' + part.originalFilename;
  }
});

İlerleme Takibi

Yükleme ilerlemesini takip edin:

form.on('progress', (bytesReceived, bytesExpected) => {
  const yuzde = (bytesReceived / bytesExpected * 100) | 0;
  process.stdout.write(`
İlerleme: ${yuzde}%`);
});

Hata Yönetimi

Ayrıştırma sırasında oluşan hataları yönetin:

form.parse(req, (err, fields, files) => {
  if (err) {
    if (err.code === 'ETOOBIG') {
      console.error('Dosya boyutu limiti aşıldı');
    } else {
      console.error('Ayrıştırma hatası:', err);
    }
    res.writeHead(err.httpCode || 400, { 'Content-Type': 'text/plain' });
    res.end(String(err));
    return;
  }
  // Alanları ve dosyaları işle
});

Alanlarla Çalışma

Form alanlarına erişin:

form.parse(req, (err, fields, files) => {
  if (err) throw err;
  console.log('Kullanıcı adı:', fields.username);
  console.log('E-posta:', fields.email);
});

JSON Ayrıştırma

JSON verilerini ayrıştırın:

const form = formidable({ encoding: 'utf-8', multiples: true });

form.parse(req, (err, fields, files) => {
  if (err) throw err;
  
  if (req.headers['content-type'] === 'application/json') {
    const jsonData = JSON.parse(fields.data);
    console.log('Ayrıştırılan JSON:', jsonData);
  }
});

Express ile Kullanım

Formidable'ı Express ile entegre edin:

const express = require('express');
const formidable = require('formidable');

const app = express();

app.post('/upload', (req, res, next) => {
  const form = formidable({ multiples: true });

  form.parse(req, (err, fields, files) => {
    if (err) {
      next(err);
      return;
    }
    res.json({ fields, files });
  });
});

app.listen(3000, () => console.log('Sunucu 3000 portunda başlatıldı'));

Dosya Akışı

Yüklenen dosyaları akışa alın:

const fs = require('fs');

form.onPart = (part) => {
  if (part.filename) {
    // Dosyaya akış
    const writeStream = fs.createWriteStream(`/tmp/${part.filename}`);
    part.pipe(writeStream);
  } else {
    // Dosya olmayan parçaları işle
    form.handlePart(part);
  }
};

Güvenlik Önlemleri

Güvenlik önlemlerini uygulayın:

const form = formidable({
  uploadDir: '/tmp',
  maxFileSize: 50 * 1024 * 1024, // 50MB
  filter: function ({ name, originalFilename, mimetype }) {
    // Sadece belirli dosya türlerine izin ver
    const izinVerilenTurler = ['image/jpeg', 'image/png', 'application/pdf'];
    return izinVerilenTurler.includes(mimetype);
  }
});

Test Etme

Supertest kullanarak dosya yüklemelerini test edin:

const request = require('supertest');
const app = require('./app'); // Express uygulamanız

describe('Dosya Yükleme', () => {
  it('bir dosya yüklemeli', async () => {
    const yanit = await request(app)
      .post('/upload')
      .attach('dosya', 'test/fixtures/test-dosyasi.txt')
      .field('isim', 'Test Dosyası');

    expect(yanit.status).toBe(200);
    expect(yanit.body.files.dosya).toBeDefined();
    expect(yanit.body.fields.isim).toBe('Test Dosyası');
  });
});

2024 © Tüm hakları saklıdır - buraxta.com