PracticU

העלאת תמונה בודדת upload לאתר ב-NodeJS

בלי כתוביותעם כתוביות
PracticU › קורס NodeJS › העלאת תמונה בודדת upload לאתר ב-NodeJS
מילון מושגים:
Node.js - סביבת ריצה שמאפשרת להריץ קוד JavaScript מחוץ לדפדפן, בעיקר בצד השרת.
HTML - שפת הסימון שבה בונים את מבנה ותוכן דפי האינטרנט, באמצעות תגיות שמגדירות כותרות, פסקאות, קישורים ועוד.
תיקייה - מכל במערכת הקבצים שמשמש לארגון קבצים ותיקיות אחרות בתוך מבנה היררכי.
ראוט - הגדרה שמקשרת כתובת בקשה לקוד שמטפל בה באפליקציה. גם מסלול שדרכו עוברות חבילות ברשת.
POST - שיטת HTTP לשליחת נתונים לשרת כדי ליצור או לעדכן משאב, למשל שליחת טופס.
טופס - אזור בממשק שבו המשתמש מזין נתונים בשדות ושולח אותם, למשל טופס הרשמה או התחברות.
אסינכרוני - אופן פעולה שבו פעולה ארוכה רצה ברקע והתוכנית ממשיכה בלי להמתין לה, ומטופלת כשתסתיים.
npm - מנהל החבילות של Node.js, המשמש להתקנה ולניהול ספריות JavaScript בפרויקט.

העלאת תמונה בודדת upload לאתר ב-NodeJS
Express בלבד לא יודע לקלוט קבצים שנשלחים מהלקוח. כאן בונים בפרויקט חדש העלאה של תמונה אחת לשרת NodeJS, שומרים אותה בדיסק ופותרים בעיה של דריסת קבצים בעלי שם זהה.
השלבים העיקריים
1. התקנות: מתקינים בפקודה אחת את express ואת express-fileupload. השנייה נדרשת כי Express לא יכול לשמור קבצים שמגיעים מהמשתמש. בקוד טוענים אותן עם require, וגם את fs לשמירה בדיסק.
2. תשתית השרת: יוצרים שרת עם Express, מנגישים את index.html עם express.static מהתיקייה הראשית (__dirname), ומעלים אותו על פורט 3000 עם הודעת listening.
3. הפעלת ההעלאה: קוראים ל-server.use עם הפונקציה fileUpload. היא לוקחת קובץ שהגיע בבקשה ומציבה אותו ב-request.files, שבלעדיה לא קיים.
4. ראוט POST ובדיקה: בראוט שמקבל את ההעלאה בודקים קודם שיש קובץ. אם אין, מחזירים סטטוס 400 עם ההודעה no file or no image sent.
5. טופס ה-HTML: בטופס action שווה לראוט, method הוא POST, ובנוסף חובה enctype עם הערך multipart/form-data, אחרת הטופס בכלל לא שולח קבצים. ה-input הוא מסוג file, וצריך לתת לו name. המרצה בוחר mySingleImage.
6. שליפת הקובץ ושמירתו: שם ה-input הוא המפתח ב-request.files, והוא מחזיר אובייקט שמתאר את הקובץ כולו. לאובייקט יש פונקציה mv (קיצור של move), שמקבלת את היעד, כאן תיקיית uploads. בסוף מחזירים ללקוח תשובה, למשל done, אחרת הוא לא יקבל כלום.
7. יצירת תיקיית uploads: בלי התיקייה השמירה קורסת עם שגיאה שאין directory כזה. בתחילת השרת, פעם אחת, בודקים עם fs.existsSync ואם התיקייה לא קיימת יוצרים אותה עם fs.mkdirSync. משתמשים בגרסה הסינכרונית כי זה קורה רק בעליית השרת, ואין צורך להסתבך עם async ו-await.
8. שם ייחודי: שמירה בשם המקורי גורמת לכך שמשתמש אחר עם קובץ באותו שם ובאותה סיומת ידרוס את הקובץ הקיים, וזה קרה בהדגמה. מתקינים את החבילה uuid וטוענים אותה. את הסיומת המקורית שולפים עם substr ו-lastIndexOf של נקודה, כך שהיא כוללת את הנקודה. שומרים את הקובץ בשם שנוצר ב-uuid גרסה 4, ואחריו הסיומת. התוצאה היא מחרוזת ייחודית באורך 36 תווים. הסיומת נשמרת כי יכולה להיות כל סיומת, והתוכנית תומכת בכל סוג קובץ ולא רק בתמונות.
9. הגבלת סוג הקבצים: בלי הגבלה אפשר לבחור כל קובץ, כולל טקסט ו-Excel. התכונה accept ב-input מגבילה את הבחירה, למשל לסוג jpeg בלבד, או ל-image/* לכל התמונות.
פקודות והגדרות
- npm i express express-fileupload והתקנה נפרדת של uuid
- req.files, file.mv, fs.existsSync, fs.mkdirSync
- enctype עם הערך multipart/form-data וגם name בשדה הקובץ
- accept עם הערך image/*
- הרצת השרת בפקודה node app
שימו לב
- בלי enctype של multipart/form-data הטופס לא שולח קבצים.
- בלי name ב-input השרת לא מוצא את הקובץ.
- בלי תיקיית uploads ההעלאה קורסת, אפילו שהלקוח קיבל done.
- קובץ ריק לא נשלח, ולכן לא נשמר.
- הפרויקט תומך כרגע בקובץ אחד בלבד, ולבחירת כמה קבצים צריך לשנות גם את הלקוח וגם את השרת.
עכשיו אפשר להעלות קובץ משתמש לשרת NodeJS, לשמור אותו בשם ייחודי ולהגביל את סוג הקבצים. בהרצאה הבאה מרחיבים את זה להעלאת כמה קבצים בבת אחת.
השיעור הבא בקורס: העלאת מספר רב של קבצים במכה אחת לאתר ב-NodeJS

פרקי ההרצאה: העלאת תמונה בודדת upload לאתר ב-NodeJS

  1. 00:00

    העלאת קבצים מהמשתמש לשרת

  2. 00:44

    התקנת express-fileupload ו-fs

  3. 03:03

    הפעלת fileUpload ו-request.files

  4. 04:33

    ראוט upload image ובדיקת קובץ חסר

  5. 06:41

    טופס HTML עם multipart/form-data

  6. 09:27

    שמירת הקובץ עם mv

  7. 10:45

    בדיקת ההעלאה בדפדפן

  8. 11:40

    יצירת תיקיית uploads עם mkdirSync

תמלול ההרצאה: העלאת תמונה בודדת upload לאתר ב-NodeJS

הטקסט המלא של הדקות הראשונות בהרצאה «העלאת תמונה בודדת upload לאתר ב-NodeJS» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:05

    הדבר הבא שאנחנו רוצים לעשות זה לאפשר למשתמש להעלות לאתר נניח תמונה. כמובן שהוא יוכל להעלות כל קובץ שהוא ירצה, לא רק תמונות, אבל אנחנו ניתן את הדוגמה הזאת על ידי העלאת תמונות.

  2. 00:22

    אז דבר ראשון יש לנו פה פרויקט חדש לגמרי בכדי לא לערב את מה שעשינו מקודם עם העלאת תמונה ומה שאנחנו רוצים זה קודם כל התקנה של אקספרס ולאקספרס אין את היכולת לשמור קבצים מהיוזר כי ראינו בעבר שאקספרס מכילה רק את היכולת להיות מעין רסטפול סרוויס או להנגיש דברים בכדי לאפשר לשמור קבצים שמגיעים מהלקוח אנחנו צריכים להתקין עוד התקנה אחת

  3. 00:55

    שנקראת אקספרס מקף פייל אפלוד אז כמובן שאנחנו יכולים בהתקנה אחת להתקין מספר התקנות הנה אקספרס התקנה אחת הנה express file upload התקנה שנייה בואו נתקין את זה ונתחיל לעלות למעלה בינתיים עד שהוא מתקין ולבנות לעצמנו פה את express require express ויש לנו פה כמובן גם את file upload require נלך ל express file upload כן קיצרתי לו פה את השם קראתי לו רק

  4. 01:41

    פייל אפלוד. מה אנחנו בעצם רוצים לעשות עם התמונות שהיוזר מעלה לאתר שלנו, לשרת שלנו? אנחנו רוצים לשמור אותם בדיסק, אז בואו נייצר לעצמנו את פייל סיסטם בשביל לאפשר את השמירה.

  5. 01:59

    require fs, ואנחנו רוצים להתחיל להעלות את השרת לאוויר. const server express, אנחנו רוצים להנגיש את דף האינדקס html, server use express static ובואו ניתן לו את הדף כך שהוא יישב לצורך הפשטות בתיקייה הראשית.

  6. 02:26

    נתנו פה דיר ניים, נעלה את האתר על ידי server listen ואנחנו מוצאים על פורט 3000 כמו תמיד. ברגע שעלית תציג לנו listening on http://localhost 3000. אז קודם כל יש לנו כרגע את התשתית עצמה שהיא מכילה רק את ההתקנות הדרושות והעלאת המידע לאוויר, ומה שאנחנו רוצים עכשיו זה להתחיל להתעסק

  7. 03:06

    עם ההעלאה עצמה. אז מה שקורה זה שאנחנו צריכים לתת הוראה לאקספרס להבין שיכול להיות שיש קבצים שמגיעים מהלקוח, זה לא משהו שהוא מגיע כדיפולט.

  8. 03:28

    אקספרס לא מתעסקת עם קבצים אבל זאת המהות של התוכנית, אנחנו רוצים שהיוזר יאפשר לבחור איזשהו קובץ מהמחשב שלו, מהקליינט, ולשלוח אותו לסרבר.

  9. 03:39

    אז אנחנו אומרים ל-express על ידי server.use ואנחנו קוראים ל-file.upload כפונקציה, file.upload זה בעצם פונקציה שאנחנו קוראים לה ומה שהפונקציה הזאת עושה זה אומרת בכל ריקווסט אם יש קובץ שמגיע בריקווסט עצמו, מקום מיוחד ברקוויסט שמתאים לקבצים, אז הפקודה הזאת לוקחת את

  10. 04:07

    הקובץ ושותלת אותו ברקוויסט עצמו, טוב, אין לי פה משתנה של רקוויסט, תכף יענו, ברקוויסט נקודה פיילס. בי דיפולט אין שום דבר כזה.

  11. 04:25

    אז זה מה שהפקודה עושה. אז כל מה שאנחנו צריכים לעשות, בואו רגע טיפה נצמצם פה בצורה כזאת, זה להגיד את הדבר הבא: אם היוזר גולש על ידי פוסט כי הרי הוא רוצה לשלוח לנו איזה משהו איזושהי תמונה נניח להוסיף איזה תמונה לבוא נניח upload image איזשהו ראוט

  12. 04:51

    שאני כרגע ממציא אז זאת הפונקציה שתתבצע מקבלת request רספונס ואנחנו רוצים קודם כל לבדוק איזושהי ולידציה האם יש לנו תמונה בכלל אולי היוזר לא שלח שום דבר ומנסה לגלוש ל-upload image זה לא הגיוני אז אם אין שום דבר ב-request files בואו נשלח לו הודעת שגיאה response.status ההודעה

  13. 05:32

    המתאימה היא 400 ונגיד לו no file or no image sent ונצא החוצה הנה יש לנו כרגע טיפול רק במצב של שגיאה הוא לא הגיוני שהוא יגלוש לי למקום שאומר לי אני רוצה להעלות לך תמונה בלי להביא לי את התמונה עצמה.

  14. 05:59

    הדבר הבא שאנחנו רוצים לעשות זה לקבל את הקובץ שלו. מה הקובץ של התמונה שהוא שלח? אנחנו כרגע מטפלים במצב שהוא שולח לנו תמונה אחת בלבד Upload Image.

  15. 06:15

    אז אנחנו רוצים לגשת ולקחת אובייקט שמתאר את כל הקובץ עצמו, זה לא רק השם שלו, זה כל הקובץ. ב-request files יש בעצם את הכובד של התמונה יושב באיזשהו משתנה שמוגדר על ידי ה-HTML אבל אנחנו עוד לא בנינו את ה-HTML אז אולי רגע בשלב הזה נעצור עם הפקודה הזאת אפילו שאני בדרך כלל לא אוהב לעצור ולחזור אבל אולי זה כן ייתן

  16. 06:54

    הבנה יותר טובה מה המשתנה שאנחנו מחפשים פה. אנחנו נבנה כרגע את אינדקס html. באינדקס html אנחנו רוצים קודם כל סימן קריאה enter, upload images, ומה שאנחנו רוצים לעשות זה קודם כל איזושהי כותרת, upload images, למרות שבהתחלה אנחנו מעלים

  17. 07:27

    תמונה אחת, אבל תכף נשנה את זה למספר תמונות. ויש לנו פה פורום, אולי נעשה את זה בצורה כזאת. Upload H2, התכוונתי, Single Image.

  18. 07:47

    וזה הדבר הראשון, בוא תעלה תמונה אחת ויחידה. יש לנו פורום ואנחנו רוצים שהאקשן, כלומר לאן הפורום הזה גולש, אז הפורום גולש לראוט הזה.

  19. 08:02

    בואו ניקח בדיוק את הראוט ונשים אותו פה. מתוד של הפורום זה פוסט ובשביל שהפורום יתמוך בהעלאת קבצים זה פיצ'ר של html שאנחנו צריכים להוסיף אנחנו חייבים לתת לו הגדרה שנקראת n-type ואנחנו צריכים לתת לו multi-part form data הפקודה הזאת אומרת ב html שאנחנו מעוניינים

  20. 08:31

    שהטופס הזה יתמוך גם בהעלאת קבצים אם אין את הפקודה הזאת הטופס בכלל לא שולח קבצים בי דיפולט אז יש לנו תיבת input אנחנו רוצים לתת לה טייפ פייל ויש לנו איזשהו לחצן של Upload.

  21. 08:53

    עכשיו אנחנו חייבים לתת Name בכדי שב-HTML המידע הזה אכן יישלח. פה ניתן לו את ה-Name MySingleImage. סתם שם שהמצאתי. השם הזה שאנחנו רואים פה זה השם שאנחנו צריכים לשים פה.

  22. 09:18

    לכן רציתי שנייה אחת לעזוב, לבנות את ה-HTML בכדי להבין שכל דבר שאנחנו שולחים על ידי פורום צריך שיהיה לו name. וה-name זה בדיוק השם שאנחנו מחפשים כאן. לא משנה שאנחנו המצאנו את השם הזה.

  23. 09:33

    זה בסדר, זה שם מומצא. עכשיו, מה יש לנו בפייל? בפייל יש לנו אובייקט שמתאר את התמונה עצמה. מה שאנחנו רוצים לעשות עכשיו זה פשוט לשמור אותה.

  24. 09:46

    יש לנו את האובייקט פייל, ויש לו פונקציה שנקראת mv, קיצור של move. ואז הוא אומר לנו, טוב, לאן אתם רוצים שאני אשמור את התמונה? בואו נגיד לו שבתיקייה הנוכחית יושבת תיקיית uploads, ובתוכה אני רוצה לשמור את file.name, זה השם של התמונה.

  25. 10:12

    אז דבר ראשון, אם אנחנו מריצים את זה ואין תיקיית upload, זה יכול להוות איזושהי בעיה. תכף נראה ונטפל בזה אבל הדבר הבא שאנחנו צריכים זה להחזיר משהו ליוזר אחרת הוא בכלל לא יצליח לקבל תשובה בחזרה בואו סתם נחזיר לו כרגע done או משהו כזה אפשר גם להפנות אותו לאיזה דף אחר אז אנחנו רוצים קודם כל לבדוק את זה

  26. 10:45

    בואו נריץ node app בואו נריץ את האתר שלנו הנה הוא נפתח ויש לנו כאן, שים את זה פה בצד, בחירה של קובץ, ויש לנו פה תיקיית אימג'ז עם שלושה קבצים, בניז, קיטנס, פאפיז.

  27. 11:08

    שימו לב שכל קובץ יש לו סיומת אחרת, png, jpeg, gif. בואו נבחר את בניז, נבצע אופן, הנה אנחנו רואים את בניז, Upload, ואנחנו מקבלים פה מאחור מעין קריסה כזאת.

  28. 11:25

    אפילו שהוא כתב לנו done, הוא לא באמת הצליח לשמור. הוא אומר לנו, תשמעו, אין לי קובץ או דיירקטורי, וזה הגיוני, אין לנו תיקייה.

  29. 11:35

    אז אנחנו יכולים לבנות כאן את התיקייה הזאת, את ה-uploads שאליה אנחנו רוצים לבצע את ההעלאה, אבל בואו נעשה משהו קצת יותר אלגנטי. מה שנעשה זה בתחילת הסרבר, פעם אחת בלבד, אנחנו רוצים לבצע בדיקה עם 0 נקודה.

  30. 11:59

    אקזיסט סינק או ליתר דיוק נוט יש לי פה סימן קריאה נוט אקזיסט את אפלודס אם התיקייה הזאת לא קיימת מייק דיר סינק צור אותה דוט סלאש אפלודס למה בעצם יש לנו פה סינק ולא אסינק מפני שהדבר הזה בן קורץ פעם אחת בלבד כאשר השרת עולה לאוויר הפקודה הזאת לא רצה עבור כל לקוח אם היינו עושים את

  31. 12:37

    הפקודה כאקזיסט כלומר אסינק אז היינו צריכים לטפל פה באסינק ואווייט ולעטוף את זה בפונקציה ולא כדאי להתעסק עם זה אם לא באמת צריך.

  32. 12:49

    אין בעיה שפעם אחת השרת

לקורס המלא: קורס NodeJS אונליין בעברית

ההרצאה הקודמת: הצגת תמונות באתר אינטרנט ב-NodeJS

ההרצאה הבאה: העלאת מספר רב של קבצים במכה אחת לאתר ב-NodeJS

הרצאות קשורות מקורסים אחרים

  • מצלמה - חלק 1 - צילום תמונה
  • הצגת תמונה ב-React
  • רפליקציה של Veeam - לאתר DR
  • הרשמה לאתר TryHackMe

קורסים נוספים במסלול

  • קורס יסודות HTML - בניית אתר אינטרנט פשוט
  • קורס CSS 3 - בדגש על Flex & Grid
  • קורס Javascript כולל JQuery
  • קורס ג'אווה סקריפט מעשי - JavaScript
  • קורס TypeScript
  • קורס ריאקט - React