Backend Node.js resim yükleme multer ve cloudinary paketleri ile yapılır mı?

Tabiki yapabilirsin. Cloudinary dökümantasyonu iyi. Çok rahat anlarsın.
Multer içinde bol bol örnek var.
Çok basit bir avatar yükleme endpointi;
JavaScript:
const express = require('express')
const cloudinary = require('cloudinary')
const path = require('path')
const multer  = require('multer')
const upload = multer({ dest: 'uploads/' })
const app = express()
cloudinary.config({ 
  cloud_name: 'my_cloud_name', 
  api_key: 'my_key', 
  api_secret: 'my_secret'
});

app.post('/profile', upload.single('avatar'), function (req, res, next) {
    const imagePath = path.join(req.file.destination, req.file.filename); // req.file içinde direkt path de olabilir.
    cloudinary.v2.uploader
      .upload(imagePath)
      .then(result=>console.log(result));
})

/*
Kaynaklar:
1. https://www.npmjs.com/package/multer
2. https://cloudinary.com/documentation/node_image_and_video_upload
*/
 
Tabii ki yapabilirsin. Cloudinary dokümantasyonu iyi. Çok rahat anlarsın.
Multer içinde bol bol örnek var.
Çok basit bir avatar yükleme endpointi;
JavaScript:
const express = require('express')
const cloudinary = require('cloudinary')
const path = require('path')
const multer = require('multer')
const upload = multer({ dest: 'uploads/' })
const app = express()
cloudinary.config({
 cloud_name: 'my_cloud_name',
 api_key: 'my_key',
 api_secret: 'my_secret'.
});

app.post('/profile', upload.single('avatar'), function (req, res, next) {
 const imagePath = path.join(req.file.destination, req.file.filename); // req.file içinde direkt path de olabilir.
 cloudinary.v2.uploader
 .upload(imagePath)
 .then(result=>console.log(result));
})

/*
Kaynaklar:
1. https://www.npmjs.com/package/multer
2. https://cloudinary.com/documentation/node_image_and_video_upload
*/

Hocam bana biraz karışık geliyor bir de multer-Storage-cloudinary diye bir paket varmış işleri daha kolaylaştıriyormus bu yüklediğim dosyalar benim bilgisayarımda da tutulacak mı?
 
@RaSGooL
Bu islemi client -> cloud seklinde tek bir upload ile halledecek bir API sunuyor mu bu servis? Ya da direkt pipe stream edilebiliyor mu?

Cunku bu durumda once backend'e ( ornekteki kodu yazan node backend ) dosya yukleniyor, yanilmiyorsam dosyanin komple upload edilmesi bekleniyor.

Sonra backend de onu cloud servise tekrar upload ediyor.

Client direct clould'a update edip bir token referansi ile gelse tek seferde halledilmis olur.

Ya da backend client upload ederken stream etse yine ~ tek upload suresinde halledilmis olur.

Bir de dosya yukleme isi guvenlik riski; tercihen backend file system e hic yuklemeden direkt stream edip kapatsak soketi o acidan da mantikli.
 
Tabii ki yapabilirsin. Cloudinary dokümantasyonu iyi. Çok rahat anlarsın.
Multer içinde bol bol örnek var.
Çok basit bir avatar yükleme endpointi;
JavaScript:
const express = require('express')
const cloudinary = require('cloudinary')
const path = require('path')
const multer = require('multer')
const upload = multer({ dest: 'uploads/' })
const app = express()
cloudinary.config({
 cloud_name: 'my_cloud_name',
 api_key: 'my_key',
 api_secret: 'my_secret'.
});

app.post('/profile', upload.single('avatar'), function (req, res, next) {
 const imagePath = path.join(req.file.destination, req.file.filename); // req.file içinde direkt path de olabilir.
 cloudinary.v2.uploader
 .upload(imagePath)
 .then(result=>console.log(result));
})

/*
Kaynaklar:
1. https://www.npmjs.com/package/multer
2. https://cloudinary.com/documentation/node_image_and_video_upload
*/

Hocam daha basit bir yol falan yok mu direk sunucuya atmaya yarayan.
 
Hocam bana biraz karışık geliyor bir de multer-Storage-cloudinary diye bir paket varmış işleri daha kolaylaştıriyormus bu yüklediğim dosyalar benim bilgisayarımda da tutulacak mı?
Tabiki ara paketler kullan. Ama asıl mantık yukarıda anlattığım gibi. multer içerisinde storage alan var. Gelen dosyayı nasıl tutacağını belirtiyorsun. Kendi storage yapını vs yapabilirsin. Ben ara paketten ziyade, senin direkt bahsettiğin ana paketleri nasıl bir arada kullanabilir çok basit şekilde gösterdim.

Hocam daha basit bir yol falan yok mu direk sunucuya atmaya yarayan.
Senin söylediğin paketin kullanımına bak. Baya kolay hale getirmişler.
Bu islemi client -> cloud seklinde tek bir upload ile halledecek bir API sunuyor mu bu servis? Ya da direkt pipe stream edilebiliyor mu?
Hatırladığım kadarıyla multer paketinin sunduğu bir streamable yapı yok. Ya memory de tutarsın yada filesystemde. Ama multer'ın da altyapısı olan busboy paketi ile pipe edebiliyorsunuz.
Cunku bu durumda once backend'e ( ornekteki kodu yazan node backend ) dosya yukleniyor, yanilmiyorsam dosyanin komple upload edilmesi bekleniyor.
Kesinlikle hocam. Ama kullanım durumunu bilmediğimiz için, bu durum bilerekte seçilmiş olabiliyor. Preprocess etmek isteyebilir. Her şeyi main storage kısmına ve db ye yazmaya gerek yok. Ben bunu sık kullanıyorum. Resimlerde vs ön işlemler çok oluyor. Zip içerisinde beklediğim formatlar yada zip içerisinden tekrar zip yapıp (dosya-şifreleme) storage kısmına öyle yüklüyorum.

Client direct clould'a update edip bir token referansi ile gelse tek seferde halledilmis olur.
Client güvenilmez. Clientdan uzak backende yakın olsun bırakalım network-bandwith kullansın önemli değil. Server -> Server sonuçta.

Ya da backend client upload ederken stream etse yine ~ tek upload suresinde halledilmis olur.
Yani hocam, süre tarafında genelde sorun olmuyor. Dosya boyutuna göre çok değişir ama genel olarak upload time sunucudan sunucuya hızlı oluyor. Ayrıca asenkron yapıyoruz çoğumuz. DB ye kaydedip adamın request karşılanmış oluyor çoktan.
Ama tabiki, sizin dediğiniz gibi ana yapıda kalırsak, evet extra maliyet, direkt stream-pipe etmekte olabilir.
Bir de dosya yukleme isi guvenlik riski; tercihen backend file system e hic yuklemeden direkt stream edip kapatsak soketi o acidan da mantikli.
Kesinlikle hocam. Bu yüzden yüklenen dosya public alanda olmamalı. Kullanıcı url ile erişememeli ve diğer önlemler alınmalı.
 
Client güvenilmez. Clientdan uzak backende yakın olsun bırakalım network-bandwith kullansın önemli değil. Server -> Server sonuçta.

Onu soyle bir sey yapiyoruz biz, client'in dosya yukleyebilecegi bir public API var. Her dosya yuklemesi sonucunda token olusturuyoruz. Token x olsun.

Sonra client, 2. bir API cagrisiyla gelip diyor ki x token li dosyayi profil fotografim yapmak istiyorum diyor.

Backend de gidip x i validate ediyor; gerekirse pre-process icin islemi yapiyor ama dosya yalnizca 1 defa upload edilmis oluyor boylecek.

Eger client 2. bir API istegi atmazsa dosya kisa surede siliniyor. Dosya guvenlik dogrulamasi da tek bir merkezde yapilmis oluyor.

Bunun soyle bir avantaji da, uygulamada file upload kismini diger endpoint'lerde yapmamis oluyoruz, herkes birbirine dosya yerine dosyaya tekabul eden token i gonderiyor. x e bak, x i bilmem ne yap vs gibi.

Ama dedigin dogru tabi, server -> server cok daha guvenilir, public dosya yukleme API'inin sorumlulugu cok ciddi. O yuzden sordum aslinda bu cloud bilmem ne destekliyor mu diye, direkt ona yuklesin client benim backend e dosya gelmesin :)
 
Onu soyle bir sey yapiyoruz biz, client'in dosya yukleyebilecegi bir public API var. Her dosya yuklemesi sonucunda token olusturuyoruz. Token x olsun.

Sonra client, 2. bir API cagrisiyla gelip diyor ki x token li dosyayi profil fotografim yapmak istiyorum diyor.

Backend de gidip x i validate ediyor; gerekirse pre-process icin islemi yapiyor ama dosya yalnizca 1 defa upload edilmis oluyor boylecek.

Eger client 2. bir API istegi atmazsa dosya kisa surede siliniyor. Dosya guvenlik dogrulamasi da tek bir merkezde yapilmis oluyor.

Bunun soyle bir avantaji da, uygulamada file upload kismini diger endpoint'lerde yapmamis oluyoruz, herkes birbirine dosya yerine dosyaya tekabul eden token i gonderiyor. x e bak, x i bilmem ne yap vs gibi.

Ama dedigin dogru tabi, server -> server cok daha guvenilir, public dosya yukleme API'inin sorumlulugu cok ciddi. O yuzden sordum aslinda bu cloud bilmem ne destekliyor mu diye, direkt ona yuklesin client benim backend e dosya gelmesin :)
Dediğiniz yöntem object-storage yapısı. Hocam sizin bu deneyimleriniz gerçekten çok takdire şayan.
Bizimde node ismini verdiğimiz şirket içinde çoğu projede kullanılan, bizzat kendim temellerini oluşturduğum bir object storage yapımız var. Sizin dediğiniz mantıkta. Ama bu projeyi kullanan Client yine bizim yazılım ekibi : )
Client dediğimiz End-user ise, public object-storage büyük sıkıntı. Adam gelir storage doldurur. Mobillerde versiyon sorunları vs olur.
 

Technopat Haberler

Geri
Yukarı