Download file in asp.net

2 באוקטובר 2009

תגיות: , , , , ,
11 תגובות

 


בתפוז נשאלה שאלה:

 

מה הקוד שצריך לכתוב כדי להוריד קובץ בעזרת לינק פשוט ?

 

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

 

 

צריך לייצר handler ולכתוב ב – ProcessRequest את הקוד הבא:

 



public void ProcessRequest(HttpContext context)


{


    string fileName = context.Request.QueryString["filename"];


    FileInfo fi = new FileInfo(fileName);


    context.Response.ContentType = "application/x-rar-compressed";


 


    context.Response.AppendHeader("Content-Disposition",


        string.Format("attachment; filename=download{0}", fi.Name));


 


    context.Response.WriteFile(fileName);


    context.Response.End();


}


 

כמובן שה – ContentType צריך להיות לפי סוג הקובץ (אפשר לבדוק בעזרת המאפיין  Extension של FileInfo.

 

 

קוד ה – html

 



<a href="MyHandler.ashx?filename=C:\MyFile.rar">Download</a>

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *

11 תגובות

  1. רועי2 באוקטובר 2009 ב 10:05

    היי
    קודם כל תודה רבה על ההשקעה

    ואם יש כמה סוגי קבצים שונים ומשונים שאני רוצה להוריד
    מה אז ?
    RAR
    PCX
    DOC

    הגב
  2. Shlomo2 באוקטובר 2009 ב 11:04

    חיפוש קצר בגוגל מה ה – ContentType של סוג הקובץ ותבדוק את הסיומת של הקובץ ולפי זה תכתוב את ה – ContentType

    הגב
  3. Moshe L3 באוקטובר 2009 ב 18:26

    אפשר גם application/msdownload
    או application/x-octet-stream

    ויש גם משתנה נוסף ששייך ל-Content Dispotion שנקרא attachment, מה שמאפשר "הורדה" גם של קבצי jpg ואחרים שהדפדפן אמור להציג בדרך כלל.

    הגב
  4. TCDooM4 באוקטובר 2009 ב 15:34

    Just remember this is asking for a hacked website! never Ever let a client side parameter be a path to file on the local drive!

    הגב
  5. תקוה14 באוקטובר 2009 ב 22:19

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

    // Buffer to read 10K bytes in chunk:
    byte[] buffer = new Byte[10000];

    // Length of the file:
    int length;

    // Total bytes to read:
    long dataToRead;

    FileStream oMovie = null;
    try
    {
    oMovie = new FileStream(filepath, FileMode.Open, FileAccess.Read, FileShare.Read);
    // Total bytes to read:
    dataToRead = oMovie.Length;
    switch (sContentType)
    {
    case "wmv":
    Response.ContentType = "video/x-ms-wmv";
    break;
    .
    .
    {
    Response.AddHeader("Content-Disposition", "attachment; filename=" + movieName);
    // Read the bytes.
    while (dataToRead > 0)
    {
    // Verify that the client is connected.
    if (Response.IsClientConnected)
    {
    // Read the data in buffer.
    length = oMovie.Read(buffer, 0, 10000);

    // Write the data to the current output stream.
    Response.OutputStream.Write(buffer, 0, length);

    // Flush the data to the HTML output.
    Response.Flush();

    buffer = new Byte[10000];
    dataToRead = dataToRead – length;
    }
    else
    {
    //prevent infinite loop if user disconnects
    dataToRead = -1;
    }
    }
    catch (Exception ex)
    {
    Console.WriteLine(ex.Message);
    Response.Write("Cannot find " + movieName);
    return;
    }
    finally
    {
    if (oMovie != null)
    {
    //Close the file.
    oMovie.Close();
    }
    Response.Close();
    }

    הגב
  6. יוסי גולדברג29 באוקטובר 2009 ב 13:55

    לא הבנתי למה צריך handler?
    זה הקוד ששמתי ב page load:
    Response.AppendHeader("Content-Disposition",
    string.Format("attachment; filename=download{0}", "myFile.css"));
    וזה עובד כמו שצריך.
    אגב ה content type לא ממש משנה לו.

    הגב
  7. Shlomo29 באוקטובר 2009 ב 14:50

    אתה צודק זה יעבוד גם בדף – אבל למה צריך דף עם זה עובד ב – handler ?
    כשיש דף יש לנו תהליך יקר של "מחזור החיים של דף" שעולה הרבה (יחסית ל – handler) לשרת

    הגב
  8. שמואל22 בנובמבר 2009 ב 20:00

    תודה רבה, הצלת לי פרויקט של שלושה חודשים!

    הגב
  9. לאה27 באוקטובר 2013 ב 6:36

    העתקתי לדף asp.net את הקישור ואת הפונקציה לקוד הc# של הדף והתכנית מגיעה לפונקציה בעת טעינת הדף ולא בעת לחיצה על הקישור.

    הגב
  10. לאה29 באוקטובר 2013 ב 18:09

    העתקתי לדף asp.net את הקישור ואת הפונקציה לקוד הc# של הדף והתכנית מגיעה לפונקציה בעת טעינת הדף ולא בעת לחיצה על הקישור.
    איך אני אגרום שהורדת הקובץ יתבצע בעת לחיצה על כפתור?

    הגב