当前位置:编程学习 > C#/ASP.NET >>

帮下忙啊,ajax中没法用response下载文件啊

在用ajax的页面中添加个下载图片的按钮,在自己没有ajax项目就能用,在公司的项目上就不能用,症状是点了按钮后没反应,页面下面提示系统错误 -1072896748 
BAIDU了一下好像说是ajax和respongse有冲突?
忘各位大虾帮帮忙啊

            System.IO.FileStream fs = System.IO.File.OpenRead(path);//path是图片地址
            byte[] FileData = new byte[fs.Length];
            fs.Read(FileData, 0, (int)fs.Length);
            Context.Response.Clear();
            Context.Response.AddHeader("Content-Type", "application/ms-excel");
            Context.Response.AddHeader("Content-Disposition", "attachment;filename=" + System.Convert.ToChar(34) + HttpUtility.UrlEncode(path, System.Text.Encoding.UTF8) + System.Convert.ToChar(34));

            Context.Response.AddHeader("Content-Length", fs.Length.ToString());
            Context.Response.BinaryWrite(FileData);
            fs.Close();

            Context.Response.Flush();
            Context.Response.End();



这个是页面的

<anthem:Button ID="btnDwload" runat="server" TextDuringCallBack="uploading..." EnabledDuringCallBack="false"
Text="下载照片"  OnClick="btnDwload_Click" CssClass="button_a" />

--------------------编程问答-------------------- 下载搞过 不刷新的没搞过
等答案 --------------------编程问答-------------------- 下载有必要用到Ajax么? --------------------编程问答-------------------- ajax 下载不太现实
第一,http 不支持直接的二进制传输,二进制数据需要编码 例如base64 ,这点服务器端可以实现
第二,客户端获得编码后的文件要转换,js应该也可以
第三点,最为致命,js无法操作客户端的文件系统,必须通过组件,例如fso,但是在ff上不兼容
--------------------编程问答-------------------- 不要做什么都要无刷新
Ajax不是万能 --------------------编程问答--------------------
引用 1 楼 koyote_love 的回复:
下载搞过 不刷新的没搞过 
等答案

不刷新的啥意思啊。。。兄台把你的代码贴下啊。。。学习下 --------------------编程问答-------------------- 但公司项目上已经用了ajax了的嘛。。。又不能改
有什么下载方法啊。。。。不用response还能用什么啊 --------------------编程问答--------------------

        Stream iStream = null;
        byte[] buffer = new Byte[10000];
        int length;
        long dataToRead;

        //string filepath = "admin/upload/ve-17B.tmp";
        string filepath = Hidden1.Value;
        string path = Server.MapPath(filepath);
        string filename = Path.GetFileName(filepath);

        try
        {

            iStream = new FileStream(path, FileMode.Open,
            FileAccess.Read, FileShare.Read);



            dataToRead = iStream.Length;

            Response.ContentType = "application/octet-stream";
            Response.AddHeader("Content-Disposition", "attachment; filename=" + filename);


            while (dataToRead > 0)
            {

                if (Response.IsClientConnected)
                {

                    length = iStream.Read(buffer, 0, 10000);


                    Response.OutputStream.Write(buffer, 0, length);


                    Response.Flush();

                    buffer = new Byte[10000];
                    dataToRead = dataToRead - length;
                }
                else
                {

                    dataToRead = -1;
                }
            }
        }
        catch (Exception ex)
        {

            Response.Write("Error : " + ex.Message);
        }
        finally
        {
            if (iStream != null)
            {

                iStream.Close();
            }
        }
--------------------编程问答-------------------- LZ的兄弟,你的代码我用过了。。。点了刷新下页面就没反应了。
没输出文件的代码啊,是不是少了Response.BinaryWrite(FileData)啊 --------------------编程问答-------------------- 继续顶,没人帮忙啊。。。 --------------------编程问答-------------------- 一个普通的链接本来就是无刷新的。 --------------------编程问答-------------------- 你用的ajax组件吧!这样是冲突,如果是写的那xmlhttphandle的那种,就别把这个下载搞成ajax了。 --------------------编程问答-------------------- LS的麻烦说详细点。。。在不改变 AJAX页面的情况下,怎么写下载语句啊。。。 --------------------编程问答-------------------- Ajax是当让不能用于下载的。如果是下载,必须要让浏览器来直接打开该URL,不能从后台用Ajax请求该URL。 --------------------编程问答-------------------- AJAX我没动它,那不是我写的
现在的问题是怎么实现下载啊,我写的东西在自己的项目就可以用,在那上面就不得行。
      
  FileInfo aFile = new FileInfo(strPhotoPath); 

        Response.Clear(); 
        Response.ClearHeaders(); 
        Response.BufferOutput   =   false; 
        Response.ContentType   =   "application/octet-stream ";
        Response.AppendHeader("Content-disposition ", "attachment;filename= " + HttpUtility.UrlEncode(photoKeyid.Trim() + ".jpg", System.Text.Encoding.UTF8)); 
        Response.AddHeader( "Content-Length ",   aFile.Length.ToString());
        Response.WriteFile(strPhotoPath); 
        Response.Flush(); 
        Response.End(); 
--------------------编程问答-------------------- 普通连接... --------------------编程问答-------------------- 是有冲突 我以前也遇到过 
你是用的updatepanel?如果是的话 可以设置它的PostBackTrigger属性,设置点一个按钮的时候回发数据 这样就避免了ajax的无刷新和response的冲突了 --------------------编程问答-------------------- 据我所知是由冲突的,不知道用iframe可否解决 --------------------编程问答--------------------
引用 1 楼 koyote_love 的回复:
下载搞过 不刷新的没搞过
等答案
--------------------编程问答-------------------- up --------------------编程问答-------------------- 放到updataPanel外面 --------------------编程问答-------------------- 直接这样不可以吗?
<a href="文件路径">点击下载</a>
用户点击了如果他机器能打开就直接打开,如果打不开就会弹出另存对话框的 --------------------编程问答-------------------- 可以动态改变href

就算打开了,还可以了另存 --------------------编程问答-------------------- <a href="文件路径">点击下载 </a> 
页面上怎么获取后台的文件地址啊?

另外我没用updatepanel控件啊。。。就是一个普通的按钮


<anthem:Button 
ID="btnDwload" 
runat="server" 
TextDuringCallBack="uploading..." EnabledDuringCallBack="false"
Text="下载照片"  
OnClick="btnDwload_Click" 
CssClass="button_a" />

--------------------编程问答-------------------- 下载文件MS不能用ajax吧,毕竟需要用户认可下载

非要实现得话,楼主去研究下脚本木马注入 --------------------编程问答-------------------- 越来越麻烦了。。。。
--------------------编程问答-------------------- 继续顶,一定要搞清楚 --------------------编程问答-------------------- 顶起,不能沉啊 --------------------编程问答-------------------- 一群bc --------------------编程问答-------------------- 我帮你 --------------------编程问答-------------------- ding --------------------编程问答-------------------- top --------------------编程问答--------------------
正好我也碰到了,不过 好像没有很好的办法来 直接解决。

大多 是 iframe 或 新窗体 解决,我是采用弹出新窗体下载。 --------------------编程问答--------------------
引用 23 楼 ry35604 的回复:
<a href="文件路径">点击下载 </a>
页面上怎么获取后台的文件地址啊?

另外我没用updatepanel控件啊。。。就是一个普通的按钮

C# code<anthem:Button 
ID="btnDwload" 
runat="server" 
TextDuringCallBack="uploading..." EnabledDuringCallBack="false"
Text="下载照片"  
OnClick="btnDwload_Click" 
CssClass="button_a"/>

你可以使用 <a id="downfile" runat="server">下载</a>
在后台 直接用 a.src="下载地址" --------------------编程问答-------------------- 写个触发器看看。。我之前好像遇到过差不多的问题 --------------------编程问答-------------------- <Triggers>
<asp:PostBackTrigger ControlID="控件名" />
</Triggers>
这样试试。。 --------------------编程问答--------------------  可以提交到隐藏框架里面,实现无刷新的下载. --------------------编程问答-------------------- 从高层看到底层,也没人解决,纠结呀 --------------------编程问答-------------------- 直接给出下载不就好了吗?
--------------------编程问答-------------------- 换种方式去实现下载功能吧,没必要一定要用ajax技术 --------------------编程问答-------------------- 空表单(action写下载文件地址)加按钮,提交不转页面就不刷新了 --------------------编程问答-------------------- LZ我曾经也遇到过这个需求,但是做了一天都没做成,最后找资料才发现Ajax不能实现下载啊,我狂晕。其实下载不用Ajax也可以,我以前想用Ajax做就是因为怕刷新页面,因为我的页面都是Ajax的并且是多页面(Tabs),最后发现不用Ajax一样很好啊....建议LZ改变思维,前车之鉴啊!嘿嘿 --------------------编程问答--------------------
引用 2 楼 suyiming 的回复:
下载有必要用到Ajax么?

如果用了就:window.open("下载地址"); --------------------编程问答-------------------- 其实很简单的,将下载的链接通过一个隐藏的iframe打开,这样既可以下载,又无需刷新页面 --------------------编程问答-------------------- 关键在于你的前台代码使用的按钮
因为这个按钮会返回后台,Ajax页面response回来的东西会给当前页面的response覆盖
你使用<a>标签,href调用该Ajax文件即可,不可以使用任何服务端控件,因为他们都会回后台从而使得Ajax页面response回来的页面会先经过当前aspx页面cs文件,response被重写而覆盖掉 --------------------编程问答-------------------- 把按钮设置成非触发器,让按钮提交,我试过,可以的,而且,整个页面不会刷新 --------------------编程问答-------------------- 下载没必要用Ajax吧 --------------------编程问答-------------------- 终究是没有一个好的解决方法
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,