1.为了达到控制权限的目的,我在服务器上创建了一个名为webdoc 的web目录,但不能直接访问
2.我创建了一个asp.net的页面(ReadAttach.aspx,可以判断是否有权限下载),通过读取视频流来播放视频文件,但视频文件大了的话,加载速度就很慢,具体调用代码如下:
<object align=middle classid=CLSID:22d6f312-b0f6-11d0-94ab-0080c74c7e95 class=OBJECT id=MediaPlayer1><param name=ShowStatusBar value=-1><param name=Filename value=/testPrj/Public/ReadAttach.aspx?filename=test.avi><embed type=application/x-oleobject codebase=http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701 flename=mp src=/testPrj/Public/ReadAttach.aspx?filename=test.avi></object>
其中 /testPrj/Public/ReadAttach.aspx?filename=test.avi 就是访问视频文件的代码。
请问该如何解决加载慢的问题?
另:如果直接访问 http://localhost/webdoc/test.avi 的话速度就很快,但这样就失去的权限控制的目的,请高手指点如何设计改权限机制?
该问题上次链接(没有解决) http://community.csdn.net/Expert/topic/4241/4241956.xml?temp=.9890711
u过你使用response.write命令直接输出视频文件,肯定慢。因为它首先把上百兆数据读入服务器内存,然后慢慢写出,并且当客户端中断的时候,服务器仍然要输出完,这就造成服务器暂时“死机”的现象。你应该在服务器端使用response.output命令,以几K大小为一个buffer,逐块读取数据并输出,每输出一块之前都检查客户端是否在线(isClientconnected),如果离线应该立刻停止输出。这样也可以与直接访问媒体文件一样“立刻”开始输出。最重要的,稍加修改,可以支持网络快车等多线程断点序传的客户端程序。
我给你贴一个,用以替代系统自带的Response.WriteFile垃圾函数,其中大部分逻辑是用来
处理断点续传得,因为观看课件也可能从中途看吧
public void WriteFile(string filepath)
{
System.IO.Stream iStream = null;
// Buffer to read 10K bytes in chunk:
byte[] buffer = new Byte[10240];
// Length of the file:
int length;
// Total bytes to read:
long dataToRead;
// Identify the file to download including its path.
//string filepath = @"E:\software\SQL Server 2000 Personal Edition.ISO";
// Identify the file name.
//string filename = System.IO.Path.GetFileName(filepath);
try
{
// Open the file.
iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open,
System.IO.FileAccess.Read,System.IO.FileShare.Read);
// Total bytes to read:
dataToRead = iStream.Length;
long p = 0;
if(Request.Headers["Range"]!=null)
{
Response.StatusCode = 206;
p = long.Parse( Request.Headers["Range"].Replace("bytes=","").Replace("-",""));
}
if(p != 0)
{
Response.AddHeader("Content-Range","bytes " + p.ToString() + "-" + ((long)(dataToRead - 1)).ToString() + "/" + dataToRead.ToString());
}
Response.AddHeader("Content-Length",((long)(dataToRead-p)).ToString());
iStream.Position = p;
dataToRead = dataToRead - p;
// Read the bytes.
while (dataToRead > 0)
{
// Verify that the client is connected.
if (Response.IsClientConnected)
{
// Read the data in buffer.
length = iStream.Read(buffer, 0, 10240);
// Write the data to the current output stream.
Response.OutputStream.Write(buffer, 0, length);
// Flush the data to the HTML output.
Response.Flush();
buffer= new Byte[10240];
dataToRead = dataToRead - length;
}
else
{
//prevent infinite loop if user disconnects
dataToRead = -1;
}
}
}
catch (Exception ex)
{
// Trap the error, if any.
Response.Write("Error : " + ex.Message);
}
finally
{
if (iStream != null)
{
//Close the file.
iStream.Close();
}
Response.End();
}
}