תחי ישראל - אין לנו ארץ אחרת

תחי ישראל -אין לנו ארץ אחרת

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

מחבר:
בתאריך:

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

שימו לב! הסקריפט במדריך מיועד למטרות לימוד בלבד. כשאתם עובדים על אתרים חיים תקפידו לעבוד עם מערכות ופריימוורקים מסודרים ואמינים. אם למרות כל מה שאמרתי אתם עדיין רוצים להשתמש בסקריפט אז הסקריפט הבטוח ביותר שאני מכיר נמצא בפרויקט שכל מתכנת חייב להכיר ששמו DVWA. הוא נמצא ב-GITHUB והוא כולל סקריפטים שבהם הדגש הוא על אבטחה. הסקריפט שמטפל בהעלאת קבצים נמצא בכתובת: DVWA - Upload vulnerabilities

 

טופס ה-HTML שמיועד להעלאת הקבצים

הטופס שמשמש להעלאת הקבצים הוא טופס רגיל, מלבד שני דברים שצריך להקפיד עליהם:

1. לתגית הפותחת של הטופס צריך להוסיף: 

enctype = "multipart/form-data" accept-charset="UTF-8"

2. צריך להוסיף לטופס שדה מיוחד שמיועד להעלאת קבצים:

<input type="file" name="file">

 

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

<form action="uploading_files.php" method="POST" enctype="multipart/form-data">
      <input type="file" name="file">
      <input type="submit" value="העלה">
</form>

 

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

טופס להעלאת קבצים

 

ה-PHP שמטפל בהעלאת הקבצים

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

if(isset($_FILES['file'])){
   // הקוד לביצוע
}

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

 

הסופר-גלובאל FILES_$

הסופר גלובאל FILES_$ הוא הדרך שבה PHP מטפל בנתונים שמועלים לשרת. נתונים אילו כוללים את שם הקובץ, סוגו, שם זמני שניתן לקובץ כשמועלה לשרת, וגודלו של הקובץ בבייטים. כדי לראות את הנתונים שמופיעים בסופר גלובאל בפעולה, ניצור את הטופס, ונצרף באזור ה-header את הקוד הבא שיציג לנו את הנתונים. 

 

if(isset($_FILES['file'])){
       $file_array = $_FILES['file'];
       echo "<div dir='ltr'><pre>";
       print_r($file_array);
}

 

כשנעלה קובץ מהמחשב, נקבל את הנתונים שמביא אתו FILES_$. לדוגמה:

Array
(
    [name] => test.js
    [type] => application/javascript 
    [tmp_name] => C:Program Files (x86)EasyPHP-12.0 mpphpF0D5.tmp 
    [error] => 0 
    [size] => 445 
)

 

הקוד שמטפל בהעלאת הקובץ לשרת

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

if(isset($_FILES['file'])){ //האם בכלל נשלח הקובץ באמצעות הטופס
     // נאחסן כל אחד מהערכים לתוך משתנה
     //זה השם המקורי שנרצה לשמור עליו גם אחרי ההעברה
     $fname  = $_FILES['file']['name'];
     //סוג הקובץ יכול לשמש להגבלת סוגי הקבצים שאנחנו מתירים להעלות
     $ftype  = $_FILES['file']['type'];
     // מכאן נצטרך להעביר את הקובץ לתיקייה הקבועה
     $ftmp   = $_FILES['file']['tmp_name'];
     // קוד שגיאה
     $ferror = $_FILES['file']['error'];
     // גודלו של הקובץ בבייטים
     $fsize  = $_FILES['file']['size'];
}

 

נשתמש בנתונים שאספנו בסעיף קודם כדי ליצור תנאים להעלאת הקובץ. בדוגמה זו, נוודא שאין שגיאה בהעלאת הקובץ (אנחנו צריכים קוד שגיאה 0), נוודא שגודלו של הקובץ לא חורג מעבר ל-1MB שזה 1048576bytes, ונאפשר העלאת קבצים מסוג תמונה בלבד. כך זה נראה:

if($ferror == 0){// נבדוק שאין שגיאה בהעלאה
      if(!empty($fname)){// נבדוק שיש שם לקובץ
           if($fsize <= 1048576){// גודלו של הקובץ לא יחרוג מ-1 מגה בייט
               if($ftype == "image/jpg" || $ftype == "image/jpeg" || $ftype == "image/png"){ //רק קבצי תמונות
                      // העברת הקובץ למקומו הקבוע תעשה כאן
               }
           }
      }
}

 

כדי להעביר את הקובץ למקומו הקבוע נשתמש בפקודה move_uploaded_file, לפי התחביר הבא:

move_uploaded_file(השם_הקבוע, המיקום_הקבוע, השם_הזמני)

כך ייראה הקוד, כשאת השם הזמני (ftmp$) ואת השם הקבוע (fname$) אנחנו לוקחים מהסופר-גלובאל FILES_$. בנוסף, צריך ליצור תיקייה שאליה תתבצע העלאת הקובץ (location$).

 $location = "uploads/"; // מיקום התיקייה הקבועה
 if(move_uploaded_file($ftmp, $location.$fname)){// העברת הקובץ למקומו הקבוע
      echo "הקובץ הועלה בהצלחה";
 } 

 

שימו לב שאת הפונקציה move_uploaded_file עטפנו בתנאי (if), וזה מפני שהיא יכולה להחזיר true במקרה שהיא הצליחה להעביר את הקובץ למקומו הקבוע או false במידה ולא הצליחה בכך. נשתמש בתכונה זו כדי לספק חיוויים לגולש באתר שמעלה את הקובץ. באופן דומה, כדאי שנספק חיוויים לכל אותן שגיאות שעלולות לפגוע בהעלאת הקובץ. כך זה נראה:

if(isset($_FILES['file'])){
   
    $fname  = $_FILES['file']['name'];
    $ftype  = $_FILES['file']['type'];
    $ftmp   = $_FILES['file']['tmp_name'];
    $ferror = $_FILES['file']['error'];
    $fsize  = $_FILES['file']['size'];
 
if($ferror == 0){
    if(!empty($fname)){
        if($fsize <= 1048576){
             if($ftype == "image/jpg" || $ftype == "image/jpeg" || $ftype == "image/png"){ // רק קבצים מתאימים יועלו לשרת
                      $location = "uploads/"; // מיקום התיקייה הקבועה
                      if(move_uploaded_file($ftmp, $location.$fname)){// העברת הקובץ
                          echo "הקובץ הועלה בהצלחה";
                      } else { echo "שגיאה בהעלאת הקובץ לשרת.";}
              } else { echo "מותר להעלות רק קבצי תמונות.";}
          } else {echo "אסור שגודלו של הקובץ יחרוג מ-1MB";}
       } else {echo "נראה ששמו של הקובץ חסר.";}
    } else { echo "אירעה שגיאה כללית בזמן העלאת הקובץ.";}
} else {echo "אתה מוזמן להעלות את הקובץ.";}

 

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

<!doctype html>
<html>
<head>
<?php
if(isset($_FILES['file'])){ //האם בכלל נשלח הקובץ באמצעות הטופס
    // נאחסן כל אחד מהערכים לתוך משתנה
   $fname  = $_FILES['file']['name'];
   $ftype  = $_FILES['file']['type'];
   $ftmp   = $_FILES['file']['tmp_name'];
   $ferror = $_FILES['file']['error'];
   $fsize  = $_FILES['file']['size'];
 
if($ferror == 0){// נבדוק שאין שגיאה בהעלאה
   if(!empty($fname)){
      if($fsize <= 1048576){
         if($ftype == "image/jpg" || $ftype == "image/jpeg" || $ftype == "image/png"){ // רק קבצים מתאימים יועלו לשרת
              $location = "uploads/"; // מיקום התיקייה הקבועה
              if(move_uploaded_file($ftmp, $location.$fname)){// ההעלאה עצמה מטופלת בשורה זו
                  echo "הקובץ הועלה בהצלחה";
              } else { echo "שגיאה בהעלאת הקובץ לשרת.";}
          } else { echo "מותר להעלות רק קבצי תמונות.";}
      } else {echo "אסור שגודלו של הקובץ יחרוג מ-1 MB";}
    } else {echo "נראה ששמו של הקובץ חסר.";}
  } else { echo "אירעה שגיאה כללית בזמן העלאת הקובץ.";}
} else {echo "אתה מוזמן להעלות את הקובץ.";}
 
?>
</head>

<body>
<form action="uploading_files.php" method="POST" enctype="multipart/form-data" accept-charset="UTF-8">
    <input type="file" name="file">
    <input type="submit" value="submit">
</form>
</body>
</html>

כל מדריכי ה-PHP

 

 

אהבתם? לא אהבתם? דרגו!

0 הצבעות, ממוצע 0 מתוך 5 כוכבים

 

 

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

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

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

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

השימוש שלך באתר מהווה ראייה להסכמתך עם הכללים והתקנות שנוסחו בהסכם תנאי השימוש.

הוסף תגובה חדשה

 

 

ענה על השאלה הפשוטה הבאה כתנאי להוספת תגובה:

איך אומרים בעברית אינטרנט?

 

תמונת המגיב

מלפפון בתאריך: 25.05.2022

אולי יש לכם את הקוד הזה בC#? אני צריך להעלות תמונה באנגולר ולעבוד איתה בסי שארפ