【问题标题】:how to detect if a URL points to a SWF如何检测 URL 是否指向 SWF
【发布时间】:2008-11-05 19:01:50
【问题描述】:

有没有办法(最好使用 JavaScript)来确定 URL 是指向 SWF 还是 JPG?

显而易见的答案是嗅探“.jpg”或“.swf”的文件名,但我正在处理由服务器动态决定的横幅,通常有很多参数,通常不包含扩展名.

所以我想知道我是否可以先加载文件,然后以某种方式读取它以确定它是 SWF 还是 JPG,然后放置它,因为我需要显示 JPG 与 SWF 的 JavaScript 代码非常不同的。

谢谢!

【问题讨论】:

    标签: javascript flash detect file-type


    【解决方案1】:

    您可以使用 javascript 通过创建动态 img-tag 来检测它是否是图像。

    function isImage(url, callback) {
        var img = document.createElement('img');
        img.onload = function() {
            callback(url);
        }
        img.src = url;
    }
    

    然后调用它:

    isImage('http://animals.nationalgeographic.com/staticfiles/NGS/Shared/StaticFiles/animals/images/primary/bald-eagle-head.jpg', function(url) { alert(url + ' is a image'); });
    

    更新 此版本将始终使用布尔值执行回调。

            function isImage(url) {
            var img = document.createElement('img');
            img.onload = function() {
                isImageCallback(url, true);
            }
            img.onerror = function() {
                isImageCallback(url, false);
            }
            img.src = url;
        }
    
        function isImageCallback(url, result) {
            if (result)
                alert(url + ' is an image');
            else
                alert(url + ' is not an image');
        }
    

    将您的逻辑放入 isImageCallback 函数中。

    【讨论】:

    • 如果我这样做,我认为它也会尝试加载 SWF。可以使用 IMG 标记加载 SWF,但当您这样做时它们永远无法正确显示。
    • 我在 IE7、FF3 和 Chrome 中测试过。不会为 swf 调用回调。
    • 好的,太好了!我试过这个,我喜欢它。只有一个问题:如果我尝试加载 SWF,因为回调永远不会触发,我需要以不同的方式放置 WSF。这会导致 2 次 SWF 负载吗?或者当 isImage 导致不是图像时,我将如何处理 SWF?
    • 是的,它会的。但是,该 swf 可能在第一次尝试下载后被浏览器缓存。我已经用另一个版本更新了答案。
    【解决方案2】:

    我会扩展思进的回答:

    对 url 的 HTTP HEAD 请求可用于检查资源的 mime 类型。你 不需要以这种方式下载文件的其余部分。

    【讨论】:

      【解决方案3】:

      完全未经测试,基本上只是一个想法:

      function isImage(url)
      {
          var http = getHTTPObject();
          http.onreadystatechange = function ()
          {
              if (http.readyState == 4)
              {
                  var contentType = http.getResponseHeader("Content Type");
                  if (contentType == "image/gif" || contentType == "image/jpeg")
                      return true;
                  else
                      return false;
              }
          }
      
          http.open("HEAD",url,true);
          http.send(null);
      }
      
      
      function getHTTPObject() 
      {
          if (window.XMLHttpRequest)
          {
              return new XMLHttpRequest();
          }
          else 
          {
              if (window.ActiveXObject)
              {
                  return new ActiveXObject("Microsoft.XMLHTTP"); 
              }
          }
          return false;
      }
      

      【讨论】:

      • 我喜欢这个,正在考虑做类似的事情。一个问题,如果我请求确定图像的类型,然后确定它是图像并加载它,是否会导致两次加载相同的图像?
      • 否,使用“HEAD”请求只会检索 HTTP 标头。
      【解决方案4】:

      我不确定您的确切设置,但您可以使用 HTTP 响应并检查 mime 类型来确定图像与闪存吗?

      【讨论】:

      • 可能。这是一个纯粹的 JavaScript/flash 设置,所以我无法访问任何服务器端脚本来执行 HTTP 请求。如果这可以通过 JS 实现,尽管它可能是答案。
      【解决方案5】:

      如果 URL 没有扩展名,那么如果不从服务器请求文件,就无法判断。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-06
        • 1970-01-01
        • 1970-01-01
        • 2012-07-22
        • 1970-01-01
        • 2013-08-20
        • 1970-01-01
        相关资源
        最近更新 更多