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.
Formidable'ı npm kullanarak yükleyin:
npm install formidable
İş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);
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ü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 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);
}
});
Yüklenen dosya adlarını özelleştirin:
const form = formidable({
uploadDir: '/tmp',
keepExtensions: true,
filename: (name, ext, part, form) => {
return 'dosya_' + part.originalFilename;
}
});
Yükleme ilerlemesini takip edin:
form.on('progress', (bytesReceived, bytesExpected) => {
const yuzde = (bytesReceived / bytesExpected * 100) | 0;
process.stdout.write(`
İlerleme: ${yuzde}%`);
});
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
});
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 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);
}
});
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ı'));
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 ö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);
}
});
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