Как открыть окно загрузки при нажатии на динамически созданную ссылку в asp.net - PullRequest
1 голос
/ 27 апреля 2010

Я сохранил txtfile в базе данных. Мне нужно показать txtfile, когда я нажму на ссылку и эта ссылка должна быть создана динамически.

мой код ниже:

код aspx:

 <div id="divlink" visible="false" runat="server">
                    </div>

aspx.cs

    protected void Page_Load(object sender, EventArgs e)
    {
        if(!Page.IsPostBack)
        {
            DataTable dtassignment = new DataTable();  

            dtassignment = serviceobj.DisplayAssignment(Session["staffname"].ToString());

                if (dtassignment != null)
                {
                    Byte[] bytes = (Byte[])dtassignment.Rows[0]["Data"];
                    //download(dtassignment);
                }
                divlink.InnerHtml = "";
                divlink.Visible = true;
                foreach (DataRow r in dtassignment.Rows)
                {
                    divlink.InnerHtml += "<a href='" + 
                            "'onclick='download(dtassignment)'>" + 
                             r["Filename"].ToString() + "</a>" + "<br/>";
                }
         }
    }

-

    public void download(DataTable dtassignment)
    {
        System.Diagnostics.Debugger.Break();

        Byte[] bytes = (Byte[])dtassignment.Rows[0]["Data"];

        Response.Buffer = true;

        Response.Charset = "";

        Response.Cache.SetCacheability(HttpCacheability.NoCache);

        Response.ContentType = dtassignment.Rows[0]["ContentType"].ToString();

        Response.AddHeader("content-disposition", "attachment;filename="

        + dtassignment.Rows[0]["FileName"].ToString());

        Response.BinaryWrite(bytes);

        Response.Flush();

        Response.End();
    }

Я получил ссылку динамически, но я не смог загрузить txtfile, когда щелкнул ссылку. как это осуществить. Пожалуйста, помогите мне ...

Ответы [ 2 ]

1 голос
/ 27 апреля 2010

В вашем примере вы генерируете якорный тег с обработчиком onclick, указывающим на функцию javascript download . При таком подходе нельзя вызвать функцию на стороне сервера.

Один из способов решить эту проблему - написать обработчик http , который будет обрабатывать загрузку, учитывая идентификатор файла в качестве параметра. Этот обработчик будет использовать идентификатор файла для извлечения содержимого файла из базы данных и записи его в ответ:

public class Download : IHttpHandler
{
    public void ProcessRequest(System.Web.HttpContext context)
    {
        // read the file name passed in the request
        string fileid = context.Request["fileid"];
        string fileContents = GetFileFromStore(fileid);
        var response = context.Response;
        response.ContentType = "text/plain";
        response.AddHeader("content-disposition", "attachment;filename=abc.txt"); 
        response.Write(fileContents);
    }

    public bool IsReusable
    {
        get { return true; }
    }
}

Следующим шагом является создание якорей, которые будут указывать на ранее созданный универсальный обработчик:

<a href="/download.ashx?fileid=1">Download file 1</a>
<a href="/download.ashx?fileid=2">Download file 2</a>
<a href="/download.ashx?fileid=3">Download file 3</a>
...
0 голосов
/ 27 апреля 2010

Прежде всего вы пытаетесь вызвать метод кода сервера, используя обработчик onclick, как указал @Darin Dimitrov.

В вашем случае я бы ASP: LinkButton

<asp:LinkButton ID="lnkBtnDownload"runat="server "OnClick="lnkBtnDownload_Click"/>

А в обработчике событий в коде я бы использовал Response.TransmitFile, например:

 //get the Temp internet folder path
 string filePath = Environment.GetFolderPath(Environment.SpecialFolder.InternetCache) + "\\" + YourFileName;
 //save the file on the server
 FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite);
 fs.Write(YourByteArray, 0, YourByteArray.Length);
 fs.Close();

 //transmit the file
 Response.ContentType = "application/octet-stream";
 Response.AppendHeader("Content-Disposition", "attachment; filename=" + YourFileName);

 Response.TransmitFile(filePath);
 Response.End();

Обратите внимание, что приведенный выше код может передавать файлы любого типа и не ограничивается текстовыми файлами.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...