HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
            request.Timeout = 150000;            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            WebHeaderCollection whc = response.Headers;
            Stream stream = response.GetResponseStream();            Response.Clear();
            Response.ContentType = "application/pdf";
            
            long len = stream.Length; //这里报错:此流不支持查找操作
            byte[] bytes = new byte[len];
            stream.Read(bytes, 0, (int)len);
            Response.BinaryWrite(bytes);
这是我自己写的程序,目的是实现从一个服务器获取一个文件流,然后输出到客户端,实现下载。看来我这个方法是不行了,所以请大家帮忙,不胜感激!100分献上。

解决方案 »

  1.   


    Response.Clear();
    Response.ClearHeaders();
    Response.Buffer = false;
    Response.AddHeader("content-disposition", "attachment;filename=" + Server.UrlEncode(文件名));
    Response.AddHeader("Content-Length", 文件长度);
    Response.ContentType = "application/octet-stream";
    Response.ContentEncoding = System.Text.Encoding.Default;
    Response.WriteFile(文件全路径);
      

  2.   

     System.DateTime currentTime = new System.DateTime();
                currentTime = System.DateTime.Now;
                string fileName = currentTime.Year.ToString() + "_" + currentTime.Month.ToString() + currentTime.Day.ToString() + "_" + currentTime.Hour.ToString() + currentTime.Minute.ToString() + ".csv";
                #endregion            #region Create StringWriter            StringWriter sw = new StringWriter();
                int tableRowLength = m_dt.Rows.Count;
                // int tableColumnLength = dt.Columns.Count;
                for (int i = 0; i < tableRowLength; ++i)
                {
                    sw.WriteLine(m_dt.Rows[i][0].ToString() + @"," + m_dt.Rows[i][1].ToString() + @"," + m_dt.Rows[i][2].ToString() + @"," + m_dt.Rows[i][3].ToString() + @"," + m_dt.Rows[i][4].ToString() + @"," + m_dt.Rows[i][5].ToString() + @"," + m_dt.Rows[i][6].ToString());
                }            #endregion            #region Download file            Response.Clear();
                Response.Buffer = true;
                Response.ContentEncoding = System.Text.Encoding.Default;
                Response.ContentType = "text/csv";
                Response.AppendHeader("content-disposition", "attachment; filename=" + fileName);
                Response.Write(sw.ToString());
                Response.Flush();
                Response.End();
      

  3.   

    void Download()
    {
    System.IO.FileStream r = new System.IO.FileStream(FileName, System.IO.FileMode.Open);  
    //设置基本信息  
    Response.Buffer= false;  
    Response.AddHeader("Connection", "Keep-Alive");  
    Response.ContentType = "application/octet-stream";  
    Response.AddHeader("Content-Disposition", "attachment;filename=" + System.IO.Path.GetFileName(FileName));  
    Response.AddHeader("Content-Length", r.Length.ToString());  
    while (true)  
    {  
    //开辟缓冲区空间  
    byte[] buffer = new byte[1024];  
    //读取文件的数据  
    int leng = r.Read(buffer, 0, 1024);  
    (leng == 0)//到文件尾,结束  
    break;  
    if (leng == 1024)//读出的文件数据长度等于缓冲区长度,直接将缓冲区数据写入  
    Response.BinaryWrite(buffer);  
    else  
    {  
    //读出文件数据比缓冲区小,重新定义缓冲区大小,只用于读取文件的最后一个数据块  
    byte[] b = new byte[leng];  
    for (int i = 0; i < leng; i++)  
    b[i] = buffer[i];  
    Response.BinaryWrite(b);  
    }  
    }  
    r.Close();//关闭下载文件  
    Response.End();//结束文件下载  
      

  4.   

    string fileName = currentTime.Year.ToString() + "_" + currentTime.Month.ToString() + currentTime.Day.ToString() + "_" + currentTime.Hour.ToString() + currentTime.Minute.ToString() + ".csv";对于这种写法我很无奈
      

  5.   

    GetResponseStream 得到的流是无法查找的你可以先把这个流复制到MemoryStream里
    private void CopyStream(Stream source, Stream dest)
        {       const int BUFFER_LENGTH = 1024; 
            int bytesRead = 0;   
            do
            {
                byte[] buffer = new byte[BUFFER_LENGTH];
                bytesRead = source.Read(buffer, 0, buffer.Length);
                dest.Write(buffer, 0, bytesRead);
            }
            while (bytesRead > 0);
        }
    这样,就可以读取MemoryStream的长度了            
                Stream stream = response.GetResponseStream();
                using (MemoryStream ms = new MemoryStream())
                {
                    CopyStream(stream, ms);
                    long len = ms.Length; 
                }
      

  6.   


    System.IO.Stream iStream = null;// 读去缓冲区的大小
    byte[] buffer = new Byte[10000];// 文件程度
    int length;// 读去的总字节数:
    long dataToRead;// 下载的文件路径标式符.
    string filepath  = "DownloadFileName";// 文件名称
    string  filename  = System.IO.Path.GetFileName(filepath);try
    {
    // 打开文件
    iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open, 
    System.IO.FileAccess.Read,System.IO.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);// 刷新数据并输出到html
    Response.Flush();buffer= new Byte[10000];
    dataToRead = dataToRead - length;
    }
    else
    {
    //如果客户端中断操作则停止读取
    dataToRead = -1;
    }
    }
    }
    catch (Exception ex) 
    {
    // 如果发生错误,输出错误信息
    Response.Write("Error : " + ex.Message);
    }
    finally
    {
    if (iStream != null) 
    {
    //Close the file.
    iStream.Close();
    }
    }
      

  7.   

                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(gxUrl);
                request.Timeout = 1500000;            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                Stream stream = response.GetResponseStream();            Response.Clear();
                Response.ContentType = "application/pdf";            int buffer = 1024;
                int alreadyRead = 0;
                do
                {
                    byte[] bytes = new byte[buffer];
                    alreadyRead = stream.Read(bytes, 0, buffer);
                    Response.BinaryWrite(bytes);
                    Response.Flush();
                } while (alreadyRead > 0);用7楼哥们提供的方法,改成这样,运行不出错。但出来的PDF图像,只有最上边的一部分,郁闷。
      

  8.   

    自己搞定了            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(gxUrl);
                request.Timeout = 1500000;            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                Stream stream = response.GetResponseStream();            Response.Clear();
                Response.ContentType = "application/pdf";
                Response.AddHeader("Content-Disposition", "attachment;filename=CNKI.PDF");
                
                int buffer = 1024;
                while (true)
                {
                    byte[] bytes = new byte[buffer];
                    int alreadyRead = stream.Read(bytes, 0, buffer);
                    if (alreadyRead == 0) break;
                    if (alreadyRead == buffer)
                        Response.BinaryWrite(bytes);
                    else
                    {
                        byte[] lastBytes = new byte[alreadyRead];
                        for (int i = 0; i < alreadyRead; i++)
                            lastBytes[i] = bytes[i];
                        Response.BinaryWrite(lastBytes);
                    }
                }
                Response.End();多谢大家帮忙,稍候结贴!