用了ASP三四年,很多人都说PHP有多好,但自己一直没动摇过立场,因为在用ASP那么久,自己需要开发的东西,还没发现PHP能实现而ASP不行的,这次的问题虽然用ASP实际上也能实现,但差距太大了,问题如下:

在用ASP做下载远程文件的功能时,想预先获取远程文件的大小,然后来做下载实时进度条。
通过文件的header头信息,可以取到远程文件大小,但在用ASP通过xmlhttp实现时,却发现,ASP必须要预加载全部的文件信息才可以读取返回header头信息,并取得Content-Length文件大小属性。
几百KB的文件速度还可以接受,如果是几M或十几几十M,程序就读死了,代码如下:

引用:
<%
'ASP获取远程文件大小方法
set xml = Server.CreateObject("MSXML2.XMLHTTP")
xml.open "GET","http://www.alixixi.com/download/xml.rar", False
xml.send
response.write "文件大小:"&xml.GetResponseHeader("Content-Length")
set xml = nothing
%>
通过上面的方式必须进行.send才要以取到header头信息。

而自己在查找资料时,找到了一个PHP的例子,测试了一下,和ASP相比简直是完全不同两种效果和技术,无论远程文件大小有多大,PHP都可以轻松快速的读到header头信息,并返回文件大小,代码如下:
引用:
<?php
function getFileSize($url){
        $url = parse_url($url);
        if($fp = @fsockopen($url['host'],empty($url['port'])?80:$url['port'],$error)){
                fputs($fp,"GET ".(empty($url['path'])?'/':$url['path'])." HTTP/1.1\r\n");
                fputs($fp,"Host:$url[host]\r\n\r\n");
                while(!feof($fp)){
                        $tmp = fgets($fp);
                        if(trim($tmp) == ''){
                                break;
                        }else if(preg_match('/Content-Length.*)/si',$tmp,$arr)){
                                return trim($arr[1]);
                        }
                }
                return null;
        }else{
                return null;
        }
}
echo getFileSize("http://www.alixixi.com/download/xml.rar")
?>
我不肯定是不是我ASP代码的原因,或是真的用ASP已经没招了,希望路过的ASP高手指点一下,是否我的代码有问题,ASP是否有其它方法解决?

如果真的ASP没办法做到,看来,我一直坚定的信念要动摇了。。
好,等人解题... ...
-----------------------------------------------
终于找到解决方案了,迟些发布上来。。

原来RANGE是关键,“RANGE:bytes=”是HTTP/1.1新增内容,HTTP/1.0每次传送文件都是从文件头开始,即0字节处开始,“RANGE:bytes=XXXX”表示要求服务器从文件XXXX字节处开始传送,这就是我们平时所说的断点续传!
只要把该参数值设为-1,就可以不传输文件数据,而直接取得文件header头信息了。
解决本问题,继续使用ASP。。。

想不到在蓝色碰到 西西, 哈哈, 学习了.

试验后效果不错, 附上代码.
复制内容到剪贴板
代码:
<%
Dim url,aSize
Url   = "http://www.alixixi.com/download/xml.rar"
aSize = getRemoteFileSize(Url)
Response.Write Url & "<hr>" & aSize(0) & "<hr>" & aSize(1)
'---------------------------------------------------
'功能: ASP获取远程文件大小
'参数: Url 目标地址
'返回: 返回数组 0:文件字节大小 1:格式化的文件大小
'---------------------------------------------------
Function getRemoteFileSize(Url)
    Dim obj,a(1),r
    Set obj = CreateObject("MSXML2.XMLHTTP")
    obj.Open "GET",url, False
    obj.setRequestHeader "Range","bytes=-1"
    obj.send
    r = Split(obj.GetResponseHeader("Content-Range") & "/0","/")
    Set Obj = Nothing
    a(0) = CLng(r(1))
    a(1) = a(0) / 1024
    If a(1) > 1024 Then
        a(1) = Round(a(1) / 1024,2) & "MB"
    Else
        a(1) = Round(a(1),2) & "KB"
    End If
    getRemoteFileSize = a
End Function
%>

ASP和PHP除了性能上的差距外,最大的功能区别就是:PHP上传文件、图片处理、伪静态(这个应该是apache的)、ASP的缓存等。其他的应用则属于非大众技术了。总得说来ASP被微软放弃更新,对于喜欢手写代码的人来说,确实是遗憾。

ASP有很多非大众技术,也就是一般人普通情况下用不到,也就介绍少,掌握得少,楼主这个就是。类似的还有server.transfer\request.form.count
一些系统函数(VB、VBS通用),比如FormatCurrency()
一些系统默认可用的组件,如创建mdb文件的ADOX.Catalog:(Set oCat = Server.CreateObject("ADOX.Catalog"):oCat.Create "Provider=Microsoft.Jet.Oledb.4.0;Data Source=" & Server.MapPath(sDataName):Set oCat = Nothing)
还有server.CreateObject("scripting.dictionary")
CreateObject("JRO.JetEngine")——压缩mdb数据库的代码中可看到

说到知识,貌似也不容易学全。:D

PHP获得文件类型,检查文件是否是MP3
2008-11-27 18:04

今天要检查一个文件是否是mp3,一时冲动要去分析Mp3的文件格式写程序去判断,折腾半天发现PHP自带的mime_content_type函数可以直接检查各种文件的类型.....MP3会返回auto....

shit....还是对PHP函数库不熟,要多看看。

http://bbs.blueidea.com/thread-2908061-1-1.html
http://hi.baidu.com/icej/blog/item/8104e71f0cb513f2e1fe0be9.html