React Native'de veritabanına görsel ekleme

Arsen Lüpen

Hectopat
Katılım
28 Şubat 2021
Mesajlar
102
Daha fazla  
Cinsiyet
Erkek
Merhaba. "React Native-image-picker" kütüphanesini kullanarak resimlerin URL'lerini database e kayıt ediyordum. Ama local olarak kayıt oluyormuş. Biraz araştırdım ve JSON formatında değil "multipart/form-data" formatında gönderilmesi gerekiyormuş. Şimdi ben diğer bilgileri JSON formatında kayıt ediyorum. Önce kodlaramı paylaşayım sonra sorularımı soracağım.
Kullanıcı kayıt olma aşamasının sonuna geldiği tüm verilerin Redux'tan alınıp Django'ya gönderileceği alan:

JavaScript:
const fetchAllUserDatas = () => {
 const name = allDatas.name;
 const about = allDatas.about;
 const email = allDatas.email;
 const gender = allDatas.gender;
 const username = allDatas.username;
 const birthdate = allDatas.birthdate;
 const profileImages = allDatas.profileImages;

 const userDatas = {
 name,
 username,
 email,
 birthdate,
 gender,
 profileImages,
 about,
 };

 Return JSON. Stringify(userdatas);
 }

 useEffect(() => {
 Const senduserdatastobackend = async () => {
 Const response = await addNewUser(fetchAllUserDatas());

 İf (response) {
 Navigation. Navigate("mainpagenavigators");
 }
 }

 sendUserDatasToBackend();
 }, []);

AddNewUser Metodu ile Json formatındaki verilerin Django tarafına yapılan post isteği:
JavaScript:
const addNewUser = async (userDatas) => {
 try {
 const response = await axios.post(`${BASE_API_URL}/add_user/`, userDatas,
 {
 headers: {
 'Content-Type': 'application/json',
 }
 }
 );
 return response;
 }
 catch (error) {
 console.error("User couldn't save to database: " + error);
 }
 };

Şimdi kodlarım böyle iken sıkıntısız bir şekilde veritabanına kaydediliyor ama resimler dediğim gibi.
file:///data/user/0/com.cheersfe/c
ache/rn_image_picker_lib_temp_0d752f09-0fab-40f0-8c89-13dec3695de0.jpg
Bu formatta geliyor. Şimdi sorularıma geliyorum.
  1. Kullanıcının diğer bilgileri ile resimleri aynı tabloda olsun istiyorum. Diğer özellikleri JSON olarak kaydedip, fotoğrafları da form-data olarak kayıt edebilir miyim? Eğer edebiliyorsam tek bir API çağrısı üstünden diğer özellikleri JSON, resimi form-data olarak gönderebilir miyim? Yoksa ayrı iki çağrı mı kullanmalıyım?
  2. Ayrı iki tablo oluşturup önce kullanıcının verilini kaydedip sonra kullanıcı tablosuna foreign key ile bağlayacağım fotoğraflar tablosuna mı kayıt etmeliyim?
  3. Resimlerle birlikte diğer verileri de form-data olara mı kayıt etmeliyim?
En pratik ve verimli çalışacak şekilde nasıl yapabilirim?
Deneme yaparken karşılaştığım sorun:
Tüm verileri form-data türünden kayıt etmek istedim.

JavaScript:
const fetchAllUserDatas = () => {
 const {
 name,
 about,
 email,
 gender,
 username,
 birthdate,
 profileImages,
 } = allDatas;

 console.log(profileImages);
 const formData = new FormData();

 formData.append('name', name);
 formData.append('about', about);
 formData.append('email', email);
 formData.append('gender', gender);
 formData.append('username', username);
 formData.append('birthdate', birthdate);

 profileImages.forEach((image, index) => {
 if (image) {
 formData.append(`profileImages[${index}]`, {
 uri: image.uri,
 type: image.type,
 name: image.fileName,
 });
 }
 });

 return formData;
 }

 useEffect(() => {
 const sendUserDatasToBackend = async () => {
 const response = await addNewUser(fetchAllUserDatas());

 if (response) {
 navigation.navigate("MainPageNavigators");
 }
 }

 sendUserDatasToBackend();
 }, []);

Bu yüzden header ı 'content-type': 'multipart/form-data', olarak değiştirdim.

JavaScript:
const addNewUser = async (formData) => {
 try {
 const response = await axios.post(`${BASE_API_URL}/add_user/`, formData,
 {
 headers: {
 'Content-Type': 'multipart/form-data',
 }
 }
 );
 return response;
 }
 catch (error) {
 console.error("User couldn't save to database: " + error);
 }
 };

Ama gelen veri yani formdata tüm verileri formdata olarak yaptığım zaman.
catch (error) {
console.error("User couldn't save to database: " + error);
}
Bu kısma düşüyor, network error hatası alıyorum. Ama form-data değil de JSON objesi olarak gönderdiğimde ise. Backende gidiyor backenddeki hata kodu çalışıyor.
Yardımcı olabilirseniz teşekkür ederim.
 
Kullanıcının diğer bilgileri ile resimleri aynı tabloda olsun istiyorum. Diğer özellikleri JSON olarak kaydedip, fotoğrafları da form-data olarak kayıt edebilir miyim? Eğer edebiliyorsam tek bir API çağrısı üstünden diğer özellikleri JSON, resimi form-data olarak gönderebilir miyim? Yoksa ayrı iki çağrı mı kullanmalıyım?
Resimleri dosya sisteminde tutup url olarak veritabanında tutmak daha mantıklı. Veritabanını şişirme hiç.

En alttaki kod mantığın doğru. FormData içerisinde tüm bilgileri yazıp gönderebilirsin ki gönderiyorsun. Django tarafı büyük ihtimalle json beklediği için hata alıyorsundur. Bakmak lazım.

Image gibi verilerini cdn üzerinden yönetebilirsin. İster kendin yaz istersen hazır sistemler kullan. Hazır sistemler için; firebase, cloudinary olabilir.
Cloudinary çok gelişmiş bir yapı sunuyor. Bakmanı tavsiye ederim. En kötü kendi sistemin içerisine upload edip ref link oluşturup db ye yazarsın.
 
Resimleri dosya sisteminde tutup URL olarak veritabanında tutmak daha mantıklı. Veritabanını şişirme hiç.

En alttaki kod mantığın doğru. Formdata içerisinde tüm bilgileri yazıp gönderebilirsin ki gönderiyorsun. Django tarafı büyük ihtimalle JSON beklediği için hata alıyorsundur. Bakmak lazım.

Image gibi verilerini CDN üzerinden yönetebilirsin. İster kendin yaz istersen hazır sistemler kullan. Hazır sistemler için; firebase, cloudinary olabilir.
Cloudinary çok gelişmiş bir yapı sunuyor. Bakmanı tavsiye ederim. En kötü kendi sistemin içerisine upload edip ref link oluşturup DB'ye yazarsın.

Cevabınız için çok teşekkür ederim. Bir dosya yapısında tutup oradan link olarak veritabanında saklamak daha mantıklı geldi. Ama nasıl yapacağımı bilmiyorum. Yani React Native-image-picker kütüphanesinde eklenen resimlerin urileri local olarak kayıt ediliyor. Yani baktığımda data-form olarak DB'ye kayıt ettiklerinde local değil herkes tarafından ulaşılır bir link olarak kayıt ediliyor. Bunun mantığını çok anlayamadım. O yüzden dosyaya kayıt ederken nasıl olacak? Bakıp araştıracağım eğer siz de bir şeyler biliyorsanız, yardımcı olabilirseniz sevinirim.

CDN tarafındaki tavsieniz üzerine bir soru sormak istiyorum. Ara ara firebase gibi bir sisteme geçmeyi düşünüyorum. Uygulamam bir mobil uygulama. Bu uygulamanın bir de web tarafı olacak. Hem mobil taraf için hem de web tarafı için ortak bir backend olarak Django kullanıyorum, veri tabanı olarak da MySQL kullanıyorum. Firebase kullanmayı düşündüm ama daha çok React Native uygulamaları için kullanıldığını gördüm. Bir de mobil uygulamam da mesajlaşma yapısı ve buna benzer anlık trafiğin yoğun olduğu yapılarda olacak. Sizce nasıl ilerlemeliyim? Yani şu an da ben hem React Native hem de Django kullanıyorum. Firebase gibi bir sistem kullanırsam sadece React Native olacak o zaman. Yani performans açısından, optimizasyon açısından iyi olacak ve büyük veri trafiğinin altından rahatça kalkabilecek bir sistem üzerine kurmak istiyorum. Sizce ne yapmalıyım, nasıl bir yol izlemeliyim? Teşekkür ederim.
 
Image picker sana cihazın dosya sistemindeki yolunu veriyor. Sen bu dosyayı alıp form-data içerisinde backend tarafına göndereceksin. Backend bu file alır ve gerekli yere kaydeder. DB ye de, bu yolu ve dosya ismi olacak şekilde (örn; /public/images/users/blabla.png) kaydedersin.

Firebase kullanmayı düşündüm ama daha çok React Native uygulamaları için kullanıldığını gördüm.
Firebase, birden fazla probleme çözüm üreten bir cloud servis. İçerisinde storage, realtime db, Notification, Analytics gibi çözümler var. Bunları http isteği atabildiğin her projede kullanabilirsin (Bknz: Firebase Rest API) ki neredeyse tüm platformlar için kendi SDK'ları mevcut. Yani React Native veya mobil için diye platform veya teknoloji ayrımı yapmıyor. Sana servisini sunuyor sen dilediğin gibi kullanabiliyorsun.

Yoğun trafiğin sıkıntı olduğu kısım backend tarafı. Backend tarafını güçlü tutarsın sorunu çözersin. Mobil uygulamanı etkilemez.
Firebase db olarak olarak kullanmayı tavsiye etmiyorum. Örnek projeler, demolar için okey. Fakat canlı bir sistem için uygun değil. İpler senin elinde olmalı.

Sizce ne yapmalıyım, nasıl bir yol izlemeliyim?
Django üzerinden devam edebilirsin. Firebase falan işleri karıştırmaya gerek yok. Şuanda sistem ayağa bir kalksın, kullanıcılar gelsin. Sonra sistemin nasıl scale edeceğini düşünürsün.
 
Image picker sana cihazın dosya sistemindeki yolunu veriyor. Sen bu dosyayı alıp form-data içerisinde backend tarafına göndereceksin. Backend bu file alır ve gerekli yere kaydeder. DB'ye de, bu yolu ve dosya ismi olacak şekilde (örneğin; /public/images/users/blabla.png) kaydedersin.

Firebase, birden fazla probleme çözüm üreten bir Cloud servis. İçerisinde Storage, realtime dB, notification, analytics gibi çözümler var. Bunları HTTP isteği atabildiğin her projede kullanabilirsin (bknz: Firebase Rest API) ki neredeyse tüm platformlar için kendi SDK'ları mevcut. Yani React Native veya mobil için diye platform veya teknoloji ayrımı yapmıyor. Sana servisini sunuyor sen dilediğin gibi kullanabiliyorsun.

Yoğun trafiğin sıkıntı olduğu kısım backend tarafı. Backend tarafını güçlü tutarsın sorunu çözersin. Mobil uygulamanı etkilemez.
Firebase dB olarak olarak kullanmayı tavsiye etmiyorum. Örnek projeler, demolar için okey. Fakat canlı bir sistem için uygun değil. İpler senin elinde olmalı.

Django üzerinden devam edebilirsin. Firebase falan işleri karıştırmaya gerek yok. Şu anda sistem ayağa bir kalksın, kullanıcılar gelsin. Sonra sistemin nasıl scale edeceğini düşünürsün.

Resimleri önce file oradan DB'ye gönderme işlemini sormuştum ama form-data olarak göndermek daha mantıklı galiba. Araştırdığımda da çoğu kişi böyle yapıyordu.

Çok teşekkür ederim yardımınız için. Firebase tarafında ki bilgiledirmeniz için de teşekkür ederim.
 

Technopat Haberler

Yeni konular

Geri
Yukarı