Node.JS

NodeJS FTP Dosya Yükleme

Merhabalar, NodeJS derslerimize kaldığımız yerden devam ediyoruz. Bu dersimizde FTP sunucusuna dosya yüklemeyi anlatacağım. Hadi başlayalım !

NodeJS ile herhangi bir şey yapabilmek için öncelikle elbette bir proje oluşturmamız gerekiyor. Bunun için proje oluşturmak istediğimiz dizine terminal (Windows için CMD) ile geçerek

npm init --yes

komutunu çalıştıralım ve projenin oluşturulmasını bekleyelim. Projenin kurulmasının ardından FTP yüklemesi için kullanacağımız paketi yani ftp paketini projemize dahil edelim. ftp paketi NodeJS kurulumu ile beraber gelen paketlerden olmadığı için bunu paket yöneticisi yardımıyla kurmamız gerekiyor. Bunun için yine terminali açarak

npm i ftp

komutunu çalıştıralım ve NPM’nin ftp paketini indirip projemize dahil etmesini bekleyelim. Paketin kurulumunun ardından proje ana dizininde index.js adında bir tane Javascript dosyası oluşturup açalım.

ftp paketini kurduk fakat index.js dosyasında bu paketi kullanılabilir hale getirmedik yani çağırmadık. Hemen paketi çağıralım;

const ftp = require('ftp');

kod satırını dosyanın başına ekleyelim. Evet paketi de çağırdık ve artık FTP yükleme işlemlerine geçebiliriz. ftp paketini kullanabilmek için de bu sınıftan yeni bir nesne türetmemiz gerekiyor çünkü yapacağımız işlemler için kullanacağımız fonksiyonlar bu paket altında bulunuyor. Hemen bu sınıftan yeni bir nesne türetelim;

const client = new ftp();

FTP’ye bir dosya yüklemek için öncelikle o FTP sunucusunda oturum açmamız gerekiyor. Sonrasında yükleme işlemini yapabileceğiz. ftp modülü ile herhangi bir FTP sunucusunda oturum açmak için ftp modülünden türettiğimiz client nesnesi altında bulunan connect() fonksiyonunu kullanacağız. Bu fonksiyon FTP bağlantı bilgilerini parametre olarak alıyor ve bu bilgileri obje yani JSON olarak istiyor. Bir FTP sunucusuna bağlanmak için FTP sunucusunun adresi, FTP protokolünün çalıştığı port numarası, sunucuya giriş yapabilmek için kullanıcı adı yada email ve şifreye ihtiyacımız var. Hemen bir bağlantı yapalım;

client.connect({
    host: 'siteadresi.com',
    port: 21,
    user: 'superkullanici',
    password: 'supersifre'
});

Burada bulunan port nesnesini göndermemiz zorunlu değil çünkü FTP protokolü çoğunlukla 21 olduğundan default değer olarak 21 atanmış, yani herhangi bir değer göndermediğimiz takdirde 21 olarak alacaktır. Ayrıca connect() metodunu parametresiz çağırırsakta local bilgisayara yani localhost:21 adresine erişmeye çalışacak, tabi local bilgisayarınızda FTP server kurulu değilse hata verecek, aksi halde bağlantı sağlanacaktır. Evet FTP sunucumuza bağlantı sağladık, sıra geldi artık dosya yükleme işlemine.

ftp modülünde yaptığımız işlemleri eventlar yardımıyla dinleyebiliyoruz, yani örneğin yapılması istenen işlem bittiğinde, bağlantı kapatıldığında yada herhangi bir sebepten dolayı hata alındığında ilgili event listener tetiklenmekte ve bu listenerlara göre istenilen işlem yapılabilmekte. Biz bağlantı talebinde bulunduk ve bağlantı gerçekleşirse ready adında bir event listener tetiklenecek ve bu event tetiklendiğinde dosya yükleme işlemini yapacağız. Doğrudan event listener kullanmadan da yükleme işlemi yapabiliriz fakat henüz bağlantı sağlanmadan yükleme işlemini başlatırsak hata alabiliriz. İşimizi garantiye almak için ready eventinin tetiklenmesini beklemek çok daha profesyonelce bir hareket olacaktır. ready eventi tetiklendikten hemen sonra yükleme işlemini yapacağız ve yükleme işlemini de put() fonksiyonunu kullanarak yapacağız. put() fonksiyonuda parametre olarak bilgisayarınızdaki kaynak dosya, FTP sunucusundaki hedef yol ve bir tane callback fonksiyonu olmak üzere toplam 3 parametre istiyor. İlk 2 parametre string tipte, üçüncü parametre ise fonksiyon olmalı ve bu fonksiyonda hata yakalamalarını yapıyor. Ayrıca ikinci parametrede gönderdiğimiz hedef yol, dosyanın tam adı şeklinde olmalı. Yani örneğin public_html değil public_html/dosya.zip şeklinde olmalı. Ayrıca FTP protokolünün çalışma gereği tek seferde tek dosya yüklenebiliyor yani ne yazık ki klasörleri tek seferde yüklemek mümkün değil. Bunun yerine klasörü oluşturup içerisindeki her bir dosyayı ayrı ayrı yüklemek gerekiyor. Örneğin masaüstünde bulunan yedek.zip dosyasını public_html/dosyalar/yedek.zip adıyla yükleyelim.

client.on('ready', function() {
    client.put('c:/users/kullanici/desktop/yedek.zip', 'public_html/dosyalar/yedek.zip', function(error) {
        if(error) throw error;
        console.log('dosya başarıyla yüklendi');
    });
});

Ayrıca yine masaüstünde bulunan veriler klasörü altındaki dosyaları da yine public_html/dosyalar yoluna yükleyelim. FTP sunucusunda klasör oluşturmak için client nesnesi altındaki mkdir() fonksiyonunu kullanıyoruz. Bu fonksiyona string tipte oluşturulacak klasörün yolu ve callback fonksiyonu olmak üzere 2 parametre gönderiyoruz.

Son olarak klasör içerisindeki dosyaları fs modülü altında bulunan readdir() veya readdirSync() fonksiyonlarını kullanarak yapacağız. Aslında hem readdir() hemde readdirSync() aynı işlemleri yapıyor, aralarındaki fark readdir() parametre olarak callback fonksiyonda alıyor ve readdirSync() fonksiyonu bu callback fonksiyonu istemiyor. readdir() fonksiyonundaki callback fonksiyonu ile hataları yakalayabiliyoruz. readdirSync() fonksiyonu ise hata olduğunda direk hata patlatıyor fakat biz hata çıkmayacağına emin olduğumuz için readdirSync() fonksiyonunu kullanabiliriz.

Az önce bahsettiğim gibi masaüstünde bulunan veriler klasörünü public_html/dosyalar yoluna yükleyelim, tabiki içerisindeki dosyaları da yükleyeceğiz.

client.on('ready', function(){
    client.mkdir('public_html/dosyalar', function(error){
        if(error) throw error;
        console.log('klasör oluşturuldu');
    });
    const kaynak = 'c:/users/kullanici/desktop/veriler';
    const files = fs.readdirSync(kaynak);
    for(const file of files) {
        client.put(path.join(kaynak, file), public_html/html/${file}));
    }
});

Son yazdığım kodun hatasız çalışabilmesi için path ve fs modüllerini kod yazdığımız ilgili dosyada çağırmamız gerektiği için dosyanın başına kod satırlarını ekleyelim.

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

Eveett, NodeJS ile FTP sunucusuna dosya yükleme işlemi bu kadardı. Yazdığımız kodları daha toplu olması için aşağıya bırakıyorum.

const fs = require('fs');
const ftp = require('ftp');
const path = require('path');
const client = new ftp();
client.connect({
    host: 'siteadresi.com',
    port: 21,
    user: 'superkullanici',
    password: 'supersifre'
});
client.on('ready', function() {
// Tek Dosya Yükleme
    client.put('c:/users/kullanici/desktop/yedek.zip', 'public_html/dosyalar/yedek.zip', function(error) {
        if(error) throw error;
        console.log('dosya başarıyla yüklendi');
    });
// Klasör İçerisindeki Dosyaları Yükleme
    client.mkdir('public_html/dosyalar', function(error){
        if(error) throw error;
        console.log('klasör oluşturuldu');
    });
    const kaynak = 'c:/users/kullanici/desktop/veriler';
    const files = fs.readdirSync(kaynak);
    for(const file of files) {
        client.put(path.join(kaynak, file), public_html/html/${file}));
    }
});

Tüm NodeJS yazılarımıza buraya tıklayarak ulaşabilirsiniz. Herkese hayırlı günler.

Skorumuz:
Oy Vermek İçin Tıklayın
[Toplam: 0 Ortalama: 0]

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.

Başa dön tuşu