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

‏ • 6 באפריל, 2002



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

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

רשימה חלקים של אובייקטים להעלאת קבצים:


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

העבודה שונה מעט בין אובייקט לאובייקט, ומאמר זה יתמקד בעבודה עם ASPUpload עקב היותו האובייקט הנפוץ יותר. המאמר מציג את הבסיס לעבודה עם האובייקט, את התיעוד המלא ניתן למצוא באתר www.aspupload.com.

בניית הטופס

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


1
2
3
4
5
6
7
8
9
10
11  

<HTML>
<BODY BGCOLOR="#FFFFFF">
   <FORM METHOD="POST" ENCTYPE="multipart/form-data"
   ACTION="UploadScript1.asp">
     File 1:<INPUT TYPE=FILE NAME="FILE1">
     File 2:<INPUT TYPE=FILE NAME="FILE2">
     <INPUT TYPE=SUBMIT VALUE="Upload!">
   </FORM>
</BODY>
</HTML>

יש לשים לב למאפיין

ENCTYPE="multipart/form-data"

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

שמירת הקבצים:

זהו הקובץ UploadScript1.asp, אליו נשלחו נתוני הטופס:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18  

<HTML>
<BODY>
    
<%
   Set Upload = Server.CreateObject("Persits.Upload.1")
   Count = Upload.Save "c:upload"
%>

Files:<BR>

<%
   For Each File in Upload.Files
      Response.Write File.Name &"= "& File.Path &" ("& File.Size &" bytes)<BR>"
   Next
%>
   
</BODY>
</HTML>


בשורה

Set Upload = Server.CreateObject("Persits.Upload.1")

אנו יוצרים מופע של האובייקט ASPUpload, וקוראים לו Upload .


השורה

Count = Upload.Save("c:upload")

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

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

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


1
2
3
4
5  

<%
For Each File in Upload.Files
    Response.Write File.Name & "= " & File.Path & " (" & File.Size & " bytes)<BR>"
Next
%>


הערה:
בגרסאות ישנות יותר של האובייקט, המאפיין FileName אינו קיים, ובמקומו יש להשתמש בשיטה ExtractFileName.


שמות ייחודיים לקבצים

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


1
2
3
4
5  

<%
    Set Upload = Server.CreateObject("Persits.Upload.1")
    Upload.OverwriteFiles = False
    Count = Upload.Save "c:upload"
%>


אם אנו מנסים להעלות קובץ בשם image.gif , ובתיקיה c:upload כבר קיים קובץ כזה, הקובץ החדש יישמר בשם image[1].gif, והקובץ הישן לא ידרס.


קביעת גודל הקובץ המקסימאלי

ביכולתינו לקבוע גודל קובץ מקסימאלי, שמעבר לו, הקובץ לא יישמר.

SetMaxSize (MaxSize As Long, Optional Reject)

MaxSize הוא הגודל המקסימאלי

Reject מציין מה לעשות אם הקובץ עובר את הגודל הנתון.


  • true – הקובץ יידחה ולא יועלה
  • false – הקובץ יעלה רק חלקית.

ברירת המחדל היא false.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23  

<HTML>
    <BODY>
    
 <%
    Set Upload = Server.CreateObject("Persits.Upload")
    Upload.SetMaxSize 50000, True

    On Error Resume Next
    Upload.Save "c:upload"
    
    If Err.Number = 8 Then
     Response.Write "Your file is too large. Please try again."
    Else
     If Err <> 0 Then
     Response.Write "An error occurred: " & Err.Description
     Else
     Response.Write "Success!"
     End If
    End If
    %>
    
    </BODY>
</HTML>


בדוגמא זו השתמשנו בביטוי On Error Resume Next, כדי שנוכל לתפוס את השגיאה אם תתרחש.

במקרה והקובץ גדול מידי, מספר השגיאה שנקבל הוא 8, וכך נוכל להציג הודעת שגיאה מתאימה.

פנייה לקבצים ספציפיים

בדוגמא הראשונה השתמשנו בלולאת For Each כדי לעבור על כל הקבצים שהועלו. אך אנו יכולים גם לפנות לקובץ ספציפי, לפי שם תיבת ה-FILE ממנה הוא הועלה:


1
2
3
4
5
6  

<%
    Set File = Upload.Files("FILE1")
    If Not File Is Nothing Then
     Response.Write File.Path
    End If
%>


באמצעות File Is Nothing, אנו בודקים אם הקובץ אכן הועלה. ביטוי זה יכול להכיל true מכמה סיבות:


  • לא נבחר קובץ להעלאה (תיבת ה-FILE נותרה ריקה)
  • תיבת ה-FILE לא היתה ריקה, אך לא הכילה נתיב חוקי לקובץ כלשהו על מחשב המשתמש
  • הקובץ עבר את גודל הקובץ המקסימאלי שהוגדר.

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

טיפול בטפסים המכילים קבצים ושדות INPUT רגילים

כאשר אנו מציינים בטופס את המאפיין "multipart/form-data" , נשללת מאיתנו האפשרות, בדף המקבל את הנתונים, להשתמש באוסף ה- Request.Form של ASP, כדי לגשת לנתונים.

כדי לפתור בעייה זו, ASPUpload מכיל אוסף נוסף, Upload.Form, המשמש לגישה לנתונים.

Upload.Form זהה לאוסף Request.Form, ויש להשתמש בו בכל פעם שרוצים לגשת לנתון כלשהו שהגיע מהטופס.

לכל אובייקט באוסף, ישנם שני מאפיינים:


  • Name – מכיל את שם תג ה-Input בטופס
  • Value – הערך שהתקבל מאותו תג




בטופס זה המשתמש מכניס את פרטיו האישיים ותמונתו:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15  

<HTML>
<BODY>
    <FORM METHOD=POST ACTION="uploadScript2.asp">
    Name: <INPUT TYPE="text" NAME="Name"><BR>
    Age: <INPUT TYPE="text" NAME="Age"><BR>
    Gender: <BR>
    Male <INPUT TYPE="radio" NAME="Gender" VALUE="Male">
    Female <INPUT TYPE="radio" NAME="Gender" VALUE="Female"><BR>
    Description: <BR>
    <TEXTAREA NAME="Description"></TEXTAREA><BR>
    Picture: <INPUT TYPE="File" NAME="Picture"><BR>
    <INPUT TYPE="submit">
    </FORM>
</BODY>
</HTML>


הקובץ uploadScript2.asp


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26  

<HTML>
   <BODY>

   <%
      Set Upload = Server.CreateObject("Persits.Upload.1")
      Upload.Save "c:upload"
   %>
    
   Files:<BR>
    
   <%
      For Each File in Upload.Files
         Response.Write File.FileName & " (" & File.Size &" bytes)<BR>"
      Next
   %>
    
   <P>Other items:<BR>
    
   <%
      For Each Item in Upload.Form
         Response.Write Item.Name & "= " & Item.Value & "<BR>"
      Next
   %>

   </BODY>
</HTML>


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

Files:
myPic.jpg (12221 bytes)

Other items:
Name= Moshe
Age= 32
Gender= Male
Description= Very big guy…

אנו יכולים גם לפנות לכל פריט של Upload.Form בנפרד, ע"י ציון שמו. לדוגמא, הרכבת שאילתה שתכניס את פרטי האדם לתוך טבלה בבסיס הנתונים:


1
2
3
4
5
6
7
8  

<%
strSQL= "INSERT INTO People (Name, Age, Gender, Description, Picture)" _
& "VALUES ('" & Upload.Form("Name") & "'," _
& Upload.Form("Age") & ",'" _
& Upload.Form("Gender") & "','" _
& Upload.Form("Description") & "','" _
& Upload.Files("Picture") & "')"
%>


גישה לנתוני הטופס לפני השמירה

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

לדוגמא, תחביר כזה יגרום שגיאה, כי אנו מנסים לגשת לאוסף Upload.Form לפני השמירה:


1
2
3
4  

<%
Set Upload = Server.CreateObject("Persits.Upload.1")
Upload.Save Upload.Form("WhereToSave")
%>


במקרה כזה, נשתמש בשיטה Save, ללא קביעת הנתיב לשמירה:

Upload.Save

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


1
2
3
4
5
6
7
8
9  

<%
    Set Upload = Server.CreateObject("Persits.Upload.1")
    Upload.Save
    Path=Upload.Form("WhereToSave")
    Set File= Upload.Files("File1")
    If Not File Is Nothing Then
        File.SaveAs Path
    End If
%>


הערה:
בגירסאות הישנות של האובייקט, אין תמיכה בשיטה Save ללא שליחת הנתיב. יש להשתמש בשיטה SaveToMemory במקום זאת.

בהצלחה!

תגיות: , , ,

תגובות בפייסבוק