העלאת קבצים לשרת באמצעות ASPUpload
לעיתים אנו נתקלים בצורך לאפשר למשתמש להעלות קובץ כלשהו לשרת. על מנת לעשות זאת, עלינו להשתמש באובייקט להעלאת קבצים כלשהו. כמה מהשרתים החינמיים, וכמעט כל השרתים בתשלום, מעמידים לרשות לקוחותיהם אובייקט כלשהו.
השלב הראשון, הוא לברר באיזה אובייקט להעלאת קבצים תומך השרת. זאת ניתן לעשות ע"י בדיקת פירוט חבילת האכסון באתר הבית של חברת הארוח, או משלוח מייל לתמיכה הטכנית.
רשימה חלקים של אובייקטים להעלאת קבצים:
לרוב האובייקטים בתשלום ישנה גם גרסת נסיון, מוגבלת בזמן, המיועדת למפתחים הרוצים לבדוק את האפליקציה לפני העלייה לשרת.
העבודה שונה מעט בין אובייקט לאובייקט, ומאמר זה יתמקד בעבודה עם ASPUpload עקב היותו האובייקט הנפוץ יותר. המאמר מציג את הבסיס לעבודה עם האובייקט, את התיעוד המלא ניתן למצוא באתר www.aspupload.com.
בניית הטופס
זהו טופס פשוט המאפשר העלאת שני קבצים מהמחשב האישי של המשתמש אל השרת:
|
|
יש לשים לב למאפיין
ENCTYPE="multipart/form-data"
מאפיין זה הוא חובה. בלעדיו לא נוכל להעלות את הקובץ. המאפיין מורה לדפדפן לשלוח את הקובץ כולו לשרת, ולא רק את שם הקובץ.
שמירת הקבצים:
זהו הקובץ UploadScript1.asp, אליו נשלחו נתוני הטופס:
|
|
בשורה
Set Upload = Server.CreateObject("Persits.Upload.1")
אנו יוצרים מופע של האובייקט ASPUpload, וקוראים לו Upload .
השורה
Count = Upload.Save("c:upload")
שומרת את כל הקבצים שהועלו, לנתיב שאנו מציינים. יש לוודא שהנתיב הינו הנתיב הנכון. אם נתיב זה אינו קיים על השרת, נקבל שגיאה.
המתודה Save מחזירה לנו את מספר הקבצים שהועלו בפועל. אם מילאנו את הטופס, אך השארנו תיבת FILE אחת ריקה, או כתבנו בה נתיב לא נכון לקובץ על המחשב, המתודה תחזיר לנו 1. לכן המשתנה Count, מכיל עכשיו את מספר הקבצים שהועלו.
בשורות הבאות, אנו עוברים בלולאה על כל הקבצים, ומדפיסים את פרטיהם – שם הקובץ וגודלו.
|
|
הערה:
בגרסאות ישנות יותר של האובייקט, המאפיין FileName אינו קיים, ובמקומו יש להשתמש בשיטה ExtractFileName.
שמות ייחודיים לקבצים
כברירת מחדל, אם נעלה קובץ באותו שם של קובץ אחר הנמצא בתיקיה, ASPUpload ידרוס את הקובץ הישן עם הקובץ החדש. אך אנו יכולים להגדיר לו לא לעשות זאת ע"י המאפיין OverwriteFiles.
|
|
אם אנו מנסים להעלות קובץ בשם image.gif , ובתיקיה c:upload כבר קיים קובץ כזה, הקובץ החדש יישמר בשם image[1].gif, והקובץ הישן לא ידרס.
קביעת גודל הקובץ המקסימאלי
ביכולתינו לקבוע גודל קובץ מקסימאלי, שמעבר לו, הקובץ לא יישמר.
SetMaxSize (MaxSize As Long, Optional Reject)
MaxSize הוא הגודל המקסימאלי
Reject מציין מה לעשות אם הקובץ עובר את הגודל הנתון.
- true – הקובץ יידחה ולא יועלה
- false – הקובץ יעלה רק חלקית.
ברירת המחדל היא false.
|
|
בדוגמא זו השתמשנו בביטוי On Error Resume Next, כדי שנוכל לתפוס את השגיאה אם תתרחש.
במקרה והקובץ גדול מידי, מספר השגיאה שנקבל הוא 8, וכך נוכל להציג הודעת שגיאה מתאימה.
פנייה לקבצים ספציפיים
בדוגמא הראשונה השתמשנו בלולאת For Each כדי לעבור על כל הקבצים שהועלו. אך אנו יכולים גם לפנות לקובץ ספציפי, לפי שם תיבת ה-FILE ממנה הוא הועלה:
|
|
באמצעות File Is Nothing, אנו בודקים אם הקובץ אכן הועלה. ביטוי זה יכול להכיל true מכמה סיבות:
- לא נבחר קובץ להעלאה (תיבת ה-FILE נותרה ריקה)
- תיבת ה-FILE לא היתה ריקה, אך לא הכילה נתיב חוקי לקובץ כלשהו על מחשב המשתמש
- הקובץ עבר את גודל הקובץ המקסימאלי שהוגדר.
ביטוי זה שימושי מאוד כאשר אנו רוצים לשמור את נתיב הקובץ בבסיס הנתונים, ועלינו לדעת אם הוא קיים או לא.
טיפול בטפסים המכילים קבצים ושדות INPUT רגילים
כאשר אנו מציינים בטופס את המאפיין "multipart/form-data" , נשללת מאיתנו האפשרות, בדף המקבל את הנתונים, להשתמש באוסף ה- Request.Form של ASP, כדי לגשת לנתונים.
כדי לפתור בעייה זו, ASPUpload מכיל אוסף נוסף, Upload.Form, המשמש לגישה לנתונים.
Upload.Form זהה לאוסף Request.Form, ויש להשתמש בו בכל פעם שרוצים לגשת לנתון כלשהו שהגיע מהטופס.
לכל אובייקט באוסף, ישנם שני מאפיינים:
- Name – מכיל את שם תג ה-Input בטופס
- Value – הערך שהתקבל מאותו תג
בטופס זה המשתמש מכניס את פרטיו האישיים ותמונתו:
|
|
הקובץ uploadScript2.asp
|
|
אנו יוצרים את האובייקט ושומרים את הקובץ/קבצים שהועלו. לאחר מכן, אנו מדפיסים את פרטי הקובץ, ואת שם כל תגי ה-Input ותוכנם. פלט לדוגמא של התוכנית:
Files:
myPic.jpg (12221 bytes)
Other items:
Name= Moshe
Age= 32
Gender= Male
Description= Very big guy…
אנו יכולים גם לפנות לכל פריט של Upload.Form בנפרד, ע"י ציון שמו. לדוגמא, הרכבת שאילתה שתכניס את פרטי האדם לתוך טבלה בבסיס הנתונים:
|
|
גישה לנתוני הטופס לפני השמירה
בתחילת המאמר ראינו כי יש צורך לשמור את הקבצים שהועלו, לפני שיש ביכולתינו לגשת לאוספים השונים. אך מה קורה אם אנו רוצים לקבוע את מיקום השמירה, בהתאם למשהו שקיבלנו מהטופס?
לדוגמא, תחביר כזה יגרום שגיאה, כי אנו מנסים לגשת לאוסף Upload.Form לפני השמירה:
|
|
במקרה כזה, נשתמש בשיטה Save, ללא קביעת הנתיב לשמירה:
Upload.Save
זה יגרום לכך שהקובץ יישמר בזכרון המחשב, ולא בנתיב פיזי. לאחר הטיפול בנתונים, נשתמש בשיטה SaveAs כדי לשמור את הקובץ במיקומו הסופי:
|
|
הערה:
בגירסאות הישנות של האובייקט, אין תמיכה בשיטה Save ללא שליחת הנתיב. יש להשתמש בשיטה SaveToMemory במקום זאת.
בהצלחה!
תגובות בפייסבוק