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分献上。
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分献上。
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(文件全路径);
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();
{
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();//结束文件下载
}
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;
}
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();
}
}
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图像,只有最上边的一部分,郁闷。
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();多谢大家帮忙,稍候结贴!