【问题标题】:getting image url's file size of remotely loaded images获取远程加载图像的图像 url 的文件大小
【发布时间】:2013-06-01 20:10:09
【问题描述】:

我在 jQuery 中有一个简单的正则表达式函数,可以将图像标签添加到用户发布的图像 URL。 这样当用户发布例如www.example.com/image.jpg 时,将添加图像标签,以便用户无需单击 URL 即可看到图像。

var hostname = window.location.hostname.replace(/\./g,'\\.');
var re = new RegExp('(http:\\/\\/[^' + hostname + ']\\S+[\\.jpeg|\\.png|\\.jpg|\\.gif])','g');

$(".texthold ").each(function() {
    $(this).html($(this).html().replace(re, '<a href="$1"><img src="$1" /></a>')); 
});

如何在允许查看图像之前检查图像的文件大小?因此,例如,如果图像文件大小大于 5MB,则不会显示图像,而是显示 URL。

【问题讨论】:

  • 这可以用 PHP 轻松完成,参见 -stackoverflow.com/questions/4635936/…
  • 我猜任何 jquery 或 javascript 中的答案都将不胜感激!
  • 您可以在 URL 上执行 HEAD(而不是 GETPOST)并检查 Content-Length 标头。 编辑: 在查看来自@lightbricko 的上述链接后,我发现那里的建议包含完整的代码... ;)

标签: javascript jquery image image-processing remote-access


【解决方案1】:
var url = ...; // here you build URL from regexp result

var req = $.ajax({
  type: "HEAD",
  url: url,
  success: function () {
    if(req.getResponseHeader("Content-Length") < 5 * 1048576) // less than 5 MB?
      ; // render image tag
    else
      ; // render URL as text   
  }
});

【讨论】:

    【解决方案2】:

    如果图像的服务器响应包含适当的跨源资源共享 (CORS) 标头和内容长度标头,您将只能完成您想要的操作。

    此外,您还需要考虑在替换循环中完成 ajax 请求所需的时间。

    下面是一个 jQuery (1.9.1) 示例,它演示了最终解决方案的样子。要使其正常工作,您需要更新指向服务器的链接,该服务器返回正确的 CORS 标头或禁用浏览器上的安全性。这个例子也在jsfiddle

    var largeImage = "http://eoimages.gsfc.nasa.gov/images/imagerecords/49000/49684/rikuzentakata_ast_2011073_lrg.jpg";
    var smallImage = "http://eoimages.gsfc.nasa.gov/images/imagerecords/81000/81258/kamchatka_amo_2013143_tn.jpg";
    var urls = [largeImage, smallImage];
    var maxSize = 5000000;
    
    $.each(urls, function(index, value) {
        conditionalMarkupUpdater(value, maxSize);
    });
    
    var onShouldBeViewable = function () {
        alert('This is a small image...Display it.');
    };
    
    var onShouldNotBeViewable = function () {
        alert('This is a large image...Only provide the url.');
    };
    
    var onError = function() {
        alert('There was an error...likely because of CORS issues see http://stackoverflow.com/questions/3102819/chrome-disable-same-origin-policy and http://www.nczonline.net/blog/2010/05/25/cross-domain-ajax-with-cross-origin-resource-sharing/"');
    };
    
    function checkSize(url) {
        var sizeChecker = new jQuery.Deferred();
    
        var onSuccess = function (data, textStatus, jqXHR) {
            var length = jqXHR.getResponseHeader('Content-Length');
            if (!length) {
                sizeChecker.reject("No size given");
            } else {
                sizeChecker.resolve(parseInt(length));
            }
        };
    
        var onFailure = function (jqXHR, textStatus, errorThrown) {
            sizeChecker.reject("Request failed");
        };
    
        $.when($.ajax({
            type: "HEAD",
            url: url
        })).then(onSuccess, onFailure);
    
        return sizeChecker.promise();
    };
    
    function conditionalMarkupUpdater(url, maxSize) {
        $.when(checkSize(url)).then(
    
        function (size) {
            if (size <= maxSize) {
                onShouldBeViewable();
            } else {
                onShouldNotBeViewable();
            }
        },
    
        function (status) {
            onError();
        })
    };
    

    【讨论】:

      猜你喜欢
      • 2014-06-08
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 2020-03-14
      • 1970-01-01
      相关资源
      最近更新 更多