לא פעם יצא לי לעבוד עם מערכות asp.net אשר צריכות לאפשר שמירה והצגה של קבצים מצורפים (attachments) – לפעמים מדובר בתמונות נלוות לפריט מידע, לפעמים במסמכים או בכל קובץ אחר.
במקרים בהם עובדים במערכת WEB, לא נהוג שהמערכת תחזיר UNC למיקום הקובץ ברשת, אלא המערכת צריכה להחזיר את הקובץ עצמו, באמצעות URL חד-ערכי שמזהה את הקובץ.
אבל, במרבית המערכות הקובץ לא ישמר על שרת ה-IIS, ככה שניתן לו URL משלו, אלא הקובץ ישב בשרת קבצים של-IIS יש גישה אליו, או אף אולי ב-DB, ויש צורך ליצור HTTP Handler על-מנת לאחזר את הקובץ.
אז מה עושים ? כותבים Handler שמגיע לקובץ/DB וטוען אותו בינארית ל-Response. מי שניסה לעשות זאת נתקל בבעיה הקטנה, שכאשר הקובץ מגיע לדפדפן, ומופיעה הההודעה המוכרת של האם לשמור או לפתוח, שם הקובץ המוצג (וזה שניתן כברירת מחדל לשמירה) הוא שם ה-ASHX עצמו ולא שם הקובץ אותו טענו ל-Response.
טיפ 1 – על-מנת לקבוע את השם שיוצג בדפדפן כשם הקובץ, יש להוסיף את השורה הבאה
context.Response.AddHeader(
"content-disposition",
"attachment; filename=\"" + fileName + "\"");
השורה הזו עובדת מצויין על שמות קבצים באנגלית, לדוגמה:
אבל אם ננסה לתת שם בעברית, ההודעה תראה כך (שימו לב לשם הקובץ):
טיפ 2 – על-מנת לאפשר הצגה של שמות הקבצים בעברית, יש להפעיל על המשתנה את המתודה UrlPathEncode באופן הבא:
fileName = context.Server.UrlPathEncode(fileName);
ואז השם יופיע טוב:
