如何在一般处理程序中下载图片文件

时间:2023-02-20 19:35:27
通过页面服务器控件BUTTON没问题,挪到handler里面就不好使了,请教高人指点

10 个解决方案

#1


什么叫搬到handler不好使,Page不也是Handler么,你还是说说详细问题

#2


引用 1 楼  的回复:
什么叫搬到handler不好使,Page不也是Handler么,你还是说说详细问题


一、aspx.cs里面
button的click事件中没问题

string strFileName = hfFileName.Value;//客户端保存的文件名
            string strFilePath = Server.MapPath("../MediaLibrary/Big/");//路径
            //以字符流的形式下载文件
            FileStream fs = new FileStream(strFilePath + strFileName, FileMode.Open);
            byte[] bytes = new byte[(int)fs.Length];
            fs.Read(bytes, 0, bytes.Length);
            fs.Close();
            Response.ContentType = "application/octet-stream";
            //通知浏览器下载文件而不是打开
            Response.AddHeader("Content-Disposition", "attachment;  filename=" + HttpUtility.UrlEncode(strFileName, Encoding.UTF8));
            Response.BinaryWrite(bytes);
            Response.Flush();
            Response.End();


二、一般处理程序Handler
通过ajax调用一般处理程序 下载不好用

public void ProcessRequest(HttpContext context)
{
string strResult = context.Server.MapPath("news.JPG"); ;
            //以字符流的形式下载文件
            FileStream fs = new FileStream(strResult, FileMode.Open);
            byte[] bytes = new byte[(int)fs.Length];
            fs.Read(bytes, 0, bytes.Length);
            fs.Close();
            context.Response.ContentType = "application/octet-stream";
            //通知浏览器下载文件而不是打开
            context.Response.AddHeader("Content-Disposition", "attachment;  filename=" + HttpUtility.UrlEncode("asdasd", System.Text.Encoding.UTF8));
            context.Response.BinaryWrite(bytes);
            context.Response.Flush();

}

#3


····   两者没区别吧。   只是说一个没有你想触发就触发而已。  

public static void TransferFile(string filepath)
    {
       // StreamWriter sw = new StreamWriter(@"E:/NDadmin/ndfile/2.txt", true, Encoding.UTF8);

        try
        {
            FileStream filestream = new FileStream(filepath, FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read);
         //   sw.WriteLine("文件完成读取");
            long filesize = filestream.Length;
         //   sw.WriteLine("查询大小完成");
            //让客户端浏览器正确识别这个文件的类型和文件大小
            string filename = System.IO.Path.GetFileName(filepath).ToLower();
        //    sw.WriteLine("识别大小完成");

            HttpContext.Current.Response.ContentType = "application/octet-stream";
         //    sw.WriteLine("制定类型完成");
            HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=\"" + HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8) + "\";");
         //    sw.WriteLine("文件位置制定完成");
            HttpContext.Current.Response.AddHeader("Content-Length", filesize.ToString());

             //sw.WriteLine("长度制定完成");
            //将文件中的数据发送到客户端
            byte[] filebuffer = new byte[filesize];
            //sw.WriteLine("获取文件数据");
            filestream.Read(filebuffer, 0, (int)filesize);
             //sw.WriteLine("发送ING");
            HttpContext.Current.Response.BinaryWrite(filebuffer);
             //sw.WriteLine("发送完成");
            filestream.Close();
              //sw.WriteLine("释放");
        }
        catch (Exception ex)
        {
            HttpContext.Current.Response.Write(ex.Message);
            throw ex;
            
              //sw.WriteLine("报错了!" + ex.Message);
              //sw.WriteLine("报错了!" + ex.TargetSite);

        }
        finally
        {
            // sw.Flush();
            //sw.Close();
        }
    }

#4


楼主,什么叫不好用,你的handler的ProcessRequest能进去么,调试下仨
引用 2 楼  的回复:
引用 1 楼  的回复:
什么叫搬到handler不好使,Page不也是Handler么,你还是说说详细问题


一、aspx.cs里面
button的click事件中没问题

string strFileName = hfFileName.Value;//客户端保存的文件名
            string strFilePath = Server.MapPath("../……

#5


1、我的图片信息显示在axpx页面中,页面有个html标签的button,并且添加了onclick事件
2、button的onclick事件里,通过ajax调用另一个一般处理程序handler并且传递了选中的图片ID
3、在一般处理程序handler里面可以得到传递过来的图片ID

我想让页面弹出另存为,把该图片保存到本地的一个路径下


#6


上面的方法完成可以满足你。。。     TransferFile(Agreement.Down_path + theme.Totalpackage);
方法后面的参数是绝对路径。   代码上面有- - 你只需要把你的ID传过去 然后获取。 

#7


引用 6 楼  的回复:
上面的方法完成可以满足你。。。 TransferFile(Agreement.Down_path + theme.Totalpackage);
方法后面的参数是绝对路径。 代码上面有- - 你只需要把你的ID传过去 然后获取。


我试了,调试通过,但是不弹出另存为那个框

#8


弹不出框么?

#9


。。   发下代码。    我这里迅雷都可以跑出来- - 。。  

#10


public void ProcessRequest(HttpContext context)
        {
            context.Response.Clear();
            context.Response.ContentType = "text/plain";
            context.Response.Buffer = true;
            context.Response.ExpiresAbsolute = DateTime.Now.AddDays(-1);
            context.Response.AddHeader("pragma", "no-cache");
            context.Response.AddHeader("cache-control", "");
            context.Response.CacheControl = "no-cache";
            context.Response.Charset = "utf-8";

            //接收来源页面URL参数
            NameValueCollection oParams = context.Request.Params;
            //返回页面的信息
            string strResult = string.Empty;
            //媒体库原图文件夹路径
            string strMediaLibraryPath = context.Server.MapPath("../MediaLibrary/Big/");
            //媒体库缩略图文件夹路径
            string strThumbnailPath = context.Server.MapPath("../MediaLibrary/Small/");

            switch (oParams["type"])
            {
                case "detail":
                    strResult = GetDetailList(strMediaLibraryPath);
                    break;
                 case "download":
                    TransferFile(strMediaLibraryPath+"news.jpg");
                    break;
                case "thumbnail":
                    strResult = GetThumbnailList(strMediaLibraryPath);
                    break;

                case "delete":
                    if (oParams["filename"] == null)
                    {
                        strResult = Convert.ToInt32(MediaLibInfo.FileDeleteError).ToString();
                        break;
                    }
                    strResult = DeleteFile(strMediaLibraryPath, oParams["filename"].ToString());
                    DeleteThumbnail(strThumbnailPath, oParams["filename"].ToString());
                    break;
                default:
                    break;
            }
            context.Response.Flush();
            context.Response.Write(strResult);
            context.Response.End();
        }

#1


什么叫搬到handler不好使,Page不也是Handler么,你还是说说详细问题

#2


引用 1 楼  的回复:
什么叫搬到handler不好使,Page不也是Handler么,你还是说说详细问题


一、aspx.cs里面
button的click事件中没问题

string strFileName = hfFileName.Value;//客户端保存的文件名
            string strFilePath = Server.MapPath("../MediaLibrary/Big/");//路径
            //以字符流的形式下载文件
            FileStream fs = new FileStream(strFilePath + strFileName, FileMode.Open);
            byte[] bytes = new byte[(int)fs.Length];
            fs.Read(bytes, 0, bytes.Length);
            fs.Close();
            Response.ContentType = "application/octet-stream";
            //通知浏览器下载文件而不是打开
            Response.AddHeader("Content-Disposition", "attachment;  filename=" + HttpUtility.UrlEncode(strFileName, Encoding.UTF8));
            Response.BinaryWrite(bytes);
            Response.Flush();
            Response.End();


二、一般处理程序Handler
通过ajax调用一般处理程序 下载不好用

public void ProcessRequest(HttpContext context)
{
string strResult = context.Server.MapPath("news.JPG"); ;
            //以字符流的形式下载文件
            FileStream fs = new FileStream(strResult, FileMode.Open);
            byte[] bytes = new byte[(int)fs.Length];
            fs.Read(bytes, 0, bytes.Length);
            fs.Close();
            context.Response.ContentType = "application/octet-stream";
            //通知浏览器下载文件而不是打开
            context.Response.AddHeader("Content-Disposition", "attachment;  filename=" + HttpUtility.UrlEncode("asdasd", System.Text.Encoding.UTF8));
            context.Response.BinaryWrite(bytes);
            context.Response.Flush();

}

#3


····   两者没区别吧。   只是说一个没有你想触发就触发而已。  

public static void TransferFile(string filepath)
    {
       // StreamWriter sw = new StreamWriter(@"E:/NDadmin/ndfile/2.txt", true, Encoding.UTF8);

        try
        {
            FileStream filestream = new FileStream(filepath, FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read);
         //   sw.WriteLine("文件完成读取");
            long filesize = filestream.Length;
         //   sw.WriteLine("查询大小完成");
            //让客户端浏览器正确识别这个文件的类型和文件大小
            string filename = System.IO.Path.GetFileName(filepath).ToLower();
        //    sw.WriteLine("识别大小完成");

            HttpContext.Current.Response.ContentType = "application/octet-stream";
         //    sw.WriteLine("制定类型完成");
            HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=\"" + HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8) + "\";");
         //    sw.WriteLine("文件位置制定完成");
            HttpContext.Current.Response.AddHeader("Content-Length", filesize.ToString());

             //sw.WriteLine("长度制定完成");
            //将文件中的数据发送到客户端
            byte[] filebuffer = new byte[filesize];
            //sw.WriteLine("获取文件数据");
            filestream.Read(filebuffer, 0, (int)filesize);
             //sw.WriteLine("发送ING");
            HttpContext.Current.Response.BinaryWrite(filebuffer);
             //sw.WriteLine("发送完成");
            filestream.Close();
              //sw.WriteLine("释放");
        }
        catch (Exception ex)
        {
            HttpContext.Current.Response.Write(ex.Message);
            throw ex;
            
              //sw.WriteLine("报错了!" + ex.Message);
              //sw.WriteLine("报错了!" + ex.TargetSite);

        }
        finally
        {
            // sw.Flush();
            //sw.Close();
        }
    }

#4


楼主,什么叫不好用,你的handler的ProcessRequest能进去么,调试下仨
引用 2 楼  的回复:
引用 1 楼  的回复:
什么叫搬到handler不好使,Page不也是Handler么,你还是说说详细问题


一、aspx.cs里面
button的click事件中没问题

string strFileName = hfFileName.Value;//客户端保存的文件名
            string strFilePath = Server.MapPath("../……

#5


1、我的图片信息显示在axpx页面中,页面有个html标签的button,并且添加了onclick事件
2、button的onclick事件里,通过ajax调用另一个一般处理程序handler并且传递了选中的图片ID
3、在一般处理程序handler里面可以得到传递过来的图片ID

我想让页面弹出另存为,把该图片保存到本地的一个路径下


#6


上面的方法完成可以满足你。。。     TransferFile(Agreement.Down_path + theme.Totalpackage);
方法后面的参数是绝对路径。   代码上面有- - 你只需要把你的ID传过去 然后获取。 

#7


引用 6 楼  的回复:
上面的方法完成可以满足你。。。 TransferFile(Agreement.Down_path + theme.Totalpackage);
方法后面的参数是绝对路径。 代码上面有- - 你只需要把你的ID传过去 然后获取。


我试了,调试通过,但是不弹出另存为那个框

#8


弹不出框么?

#9


。。   发下代码。    我这里迅雷都可以跑出来- - 。。  

#10


public void ProcessRequest(HttpContext context)
        {
            context.Response.Clear();
            context.Response.ContentType = "text/plain";
            context.Response.Buffer = true;
            context.Response.ExpiresAbsolute = DateTime.Now.AddDays(-1);
            context.Response.AddHeader("pragma", "no-cache");
            context.Response.AddHeader("cache-control", "");
            context.Response.CacheControl = "no-cache";
            context.Response.Charset = "utf-8";

            //接收来源页面URL参数
            NameValueCollection oParams = context.Request.Params;
            //返回页面的信息
            string strResult = string.Empty;
            //媒体库原图文件夹路径
            string strMediaLibraryPath = context.Server.MapPath("../MediaLibrary/Big/");
            //媒体库缩略图文件夹路径
            string strThumbnailPath = context.Server.MapPath("../MediaLibrary/Small/");

            switch (oParams["type"])
            {
                case "detail":
                    strResult = GetDetailList(strMediaLibraryPath);
                    break;
                 case "download":
                    TransferFile(strMediaLibraryPath+"news.jpg");
                    break;
                case "thumbnail":
                    strResult = GetThumbnailList(strMediaLibraryPath);
                    break;

                case "delete":
                    if (oParams["filename"] == null)
                    {
                        strResult = Convert.ToInt32(MediaLibInfo.FileDeleteError).ToString();
                        break;
                    }
                    strResult = DeleteFile(strMediaLibraryPath, oParams["filename"].ToString());
                    DeleteThumbnail(strThumbnailPath, oParams["filename"].ToString());
                    break;
                default:
                    break;
            }
            context.Response.Flush();
            context.Response.Write(strResult);
            context.Response.End();
        }