上传图像时控制图像宽度和高度

时间:2012-12-30 14:27:09

标签: javascript jquery html5 plupload

直截了当。我想在用户使用plupload上传图像时设置图像宽度和高度的限制。

Letsay: 如果 宽度:1000px 身高:1000px 其他 您必须上传至少宽度为1000px和高度:1000px

的图像
// $(".form").validator();
$(function() {
    if($("#uploader").length > 0) {
        var uploader = new plupload.Uploader({
            runtimes : 'html5,flash,silverlight',
            browse_button : 'pickfile',
            container : 'uploader',
            max_file_size : '10mb',
            url : 'design.php?do=upload&ajax=1',
            multiple_queues: false,
            file_data_name: 'design',
            flash_swf_url : www + '/js/plupload.flash.swf',
            silverlight_xap_url : www + '/js/plupload.silverlight.xap',
            filters : [
                {title : "Image files", extensions : "jpg,gif,png,jpeg,bmp"}
            ]

        });

        $('#uploadfiles').click(function(e) {
            if($("#uploader select[name=category]").val() == "") {
                $("#uploader select[name=category]").next('.error-required').show();
                return false;
            }

            uploader.start();
            e.preventDefault();
        });

        uploader.init();

那么,这可能吗?

4 个答案:

答案 0 :(得分:3)

您可以轻松编写一个用于plupload的过滤器。

这是最小所需宽度的过滤器。 将波纹管代码添加到您的脚本中。 (只需复制)

plupload.addFileFilter('min_width', function(maxwidth, file, cb) {
    var self = this, img = new o.Image();

    function finalize(result) {
        // cleanup
        img.destroy();
        img = null;

       // if rule has been violated in one way or another, trigger an error
        if (!result) {
            self.trigger('Error', {
                code : plupload.IMAGE_DIMENSIONS_ERROR,
                message : "Image width should be more than " + maxwidth  + " pixels.",
                file : file
            });
     }
        cb(result);
    }
    img.onload = function() {
        // check if resolution cap is not exceeded
        finalize(img.width >= maxwidth);
    };
    img.onerror = function() {
        finalize(false);
    };
    img.load(file.getSource());
});

并将此过滤器添加到您的上传脚本中。

filters : {
            min_width: 700,
        },

答案 1 :(得分:1)

Plupload不支持此功能(although it has been requested)。可能有几个原因造成这种情况,首先是因为您无法在上传IE(you can in some other browsers)之前获取图像尺寸,其次,虽然这对某些使用HTML4 / 5方法的浏览器有效,我不确定Flash / Silverlight等方法是否也能够可靠地确定尺寸。

如果您对有限的浏览器,HTML4 / 5方法感到满意,那么您应该只使用"FilesAdded" event

uploader.bind('FilesAdded', function(up, files) {
  //Get src of each file, create image, remove from file list if too big
});

答案 2 :(得分:0)

我最近想做同样的事情,并且能够像Thom所建议的那样实现它。尽管如此,他是正确的;如果你想添加它,它只能在现代浏览器中使用,而不能在flash或silverlight运行时使用。这不是一个大问题,因为我的非html5用户只会在上传之后收到错误,而不是之前。

我初始化了一个总图像计数变量,以跟踪页面上放置的图像。在我们阅读所有照片之后,还可以存储我们要删除的照片。

var total_image_count = 0;
var files_to_remove = [];

然后我用FileReader()读取待处理的文件,将它们放在页面上,并获得它们的宽度

init:{
        FilesAdded: function(up, files) {
           if (uploader.runtime == "html5"){
              files = jQuery("#"+uploader.id+"_html5")[0].files
              console.log(files);
              for (i in files){

                 //create image tag for the file we are uploading
                 jQuery("<img />").attr("id","image-"+total_image_count).appendTo("#upload-container");

                 reader_arr[total_image_count] = new FileReader();

                 //create listener to place the data in the newly created 
                 //image tag when FileReader fully loads image.
                 reader_arr[total_image_count].onload = function(total_image_count) {
                    return function(e){
                       var img = $("#image-"+total_image_count);
                       img.attr('src', e.target.result);
                       if ($(img)[0].naturalWidth < 1000){

                          files_to_remove.push(files[i]); //remove them after we finish reading in all the files
                          //This is where you would append an error to the DOM if you wanted.
                          console.log("Error. File must be at least 1000px");
                       }
                    }
                 }(total_image_count);

                 reader_arr[total_image_count].readAsDataURL(files[i]);

                 total_image_count++;
              }
              for (i in files_to_remove){
                 uploader.removeFile(files_to_remove[i]);
              }
           }
        }
     }

作为旁注,无论如何我想要显示图像缩略图,所以这种方法对我很有用。我没有想出如何在没有先将它附加到DOM的情况下获得图像的宽度。

来源:

  

上传前缩略图片:   https://stackoverflow.com/a/4459419/686440

     

访问图片的自然宽度:   https://stackoverflow.com/a/1093414/686440

答案 3 :(得分:0)

要访问宽度和高度而不使用缩略图,您可以执行以下操作:

uploader.bind('FilesAdded', function(up, files) {
    files = jQuery("#"+uploader.id+"_html5").get(0).files;
    jQuery.each(files, function(i, file) {
        var reader = new FileReader();
        reader.onload = (function(e) { 
            var image = new Image();
            image.src = e.target.result;

                image.onload = function() {
                    // access image size here using this.width and this.height
                }
            };

        });

        reader.readAsDataURL(file);
    }
}