【问题标题】:Is it possible to check dimensions of image before uploading?是否可以在上传之前检查图像的尺寸?
【发布时间】:2012-11-26 19:56:49
【问题描述】:

我有一个用于将图像上传到服务器的上传控件,但在上传之前,我只想确保图像的尺寸是否正确。 客户端有什么可以用 JavaScript 完成的吗?

【问题讨论】:

标签: javascript jquery file-upload client-side


【解决方案1】:

您可以在提交表单之前检查它们:

window.URL = window.URL || window.webkitURL;

$("form").submit( function( e ) {
    var form = this;
    e.preventDefault(); //Stop the submit for now
                                //Replace with your selector to find the file input in your form
    var fileInput = $(this).find("input[type=file]")[0],
        file = fileInput.files && fileInput.files[0];

    if( file ) {
        var img = new Image();

        img.src = window.URL.createObjectURL( file );

        img.onload = function() {
            var width = img.naturalWidth,
                height = img.naturalHeight;

            window.URL.revokeObjectURL( img.src );

            if( width == 400 && height == 300 ) {
                form.submit();
            }
            else {
                //fail
            }
        };
    }
    else { //No file was input or browser doesn't support client side reading
        form.submit();
    }

});

这仅适用于现代浏览器,因此您仍然需要检查服务器端的尺寸。你也不能相信 客户端,这是您无论如何都必须在服务器端检查它们的另一个原因。

【讨论】:

【解决方案2】:

是的,HTML5 API 支持这个。

http://www.w3.org/TR/FileAPI/

var _URL = window.URL || window.webkitURL;

$("#file").change(function(e) {

    var image, file;

    if ((file = this.files[0])) {

        image = new Image();

        image.onload = function() {

            alert("The image width is " +this.width + " and image height is " + this.height);
        };

        image.src = _URL.createObjectURL(file);


    }

});​

DEMO(在 chrome 上测试)

【讨论】:

  • @AlienWebguy - 当然是,看到这个SITE,当删除或选择图像时,名称、文件大小和尺寸会立即更新,而无需将图像上传到服务器。
【解决方案3】:

可能有点晚了,但这是一个现代 ES6 版本的使用承诺的公认答案

const getUploadedFileDimensions: file => new Promise((resolve, reject) => {
    try {
        let img = new Image()

        img.onload = () => {
            const width  = img.naturalWidth,
                  height = img.naturalHeight

            window.URL.revokeObjectURL(img.src)

            return resolve({width, height})
        }

        img.src = window.URL.createObjectURL(file)
    } catch (exception) {
        return reject(exception)
    }
})

你会这样称呼它

getUploadedFileDimensions(file).then(({width, height}) => {
    console.log(width, height)
})

【讨论】:

    【解决方案4】:

    为简单起见,请使用 fabric.jsprocessing.jsMarvinJ 等 JavaScript 图像处理框架。

    对于MarvinJ,只需在客户端加载图像并使用getWidth()getHeight()方法检查图像的尺寸。有了这些维度,您就可以允许文件提交或通知用户有关不兼容的维度。

    示例:

    var image = new MarvinImage();
    image.load("https://i.imgur.com/oOZmCas.jpg", imageLoaded);
    
    function imageLoaded(){
      document.getElementById("result").innerHTML += image.getWidth()+","+image.getHeight();
    }
    <script src="https://www.marvinj.org/releases/marvinj-0.8.js"></script>
    <div id="result"></div>

    【讨论】:

      【解决方案5】:

      如果您不需要处理 svg 文件并且可以将自己限制为 newest browsers,那么您可以使用 createImageBitmap 函数来制作基于 Promise 的单行:

      if(typeof createImageBitmap !== "function") {
        console.error("Your browser doesn't support this method");
        // fallback to URL.createObjectURL + <img>
      }
      
      inp.oninput = e => {
        createImageBitmap(inp.files[0])
          .then((bmp) => console.log(bmp.width, bmp.height))
          .catch(console.error);
      }
      &lt;input type="file" id="inp" accept="image/*"&gt;

      【讨论】:

        【解决方案6】:

        @Klemen Tusar 的多个文件分析器的扩展:

        const loadImage = file => new Promise((resolve, reject) => {
            try {
                const image = new Image();
        
                image.onload = function () {
                    resolve(this)
                };
        
                image.onerror = function () {
                    reject("Invalid image. Please select an image file.");
                }
        
                image.src = window.URL.createObjectURL(file);
            } catch (e) {
                reject(e)
            }
        })
        
        const loadImagesArray = async files => {
            let images = Array(files.length)
            await Promise.all(files.map((file, i) => (async () => {
                const loadedImage = await loadImage(file)
                images[i] = loadedImage
            })()))
            return images
        }
        

        然后您可以简单地检查加载图像上的内容,如下所示:

        const loadedImages = await loadImagesArray(e.currentTarget.files)
        for(const loadedImage of loadedImages) {
            console.log(loadedImage.width, loadedImage.height)
        }
        

        【讨论】:

          【解决方案7】:

          试一试。我过去用过这个。 https://github.com/valums/file-uploader

          【讨论】:

          • OP 说他们已经有一个上传控件但想要一个额外的功能。给他们一个全新的上传控件并不是一个很好的答案。他们想要的只是尺寸。无论如何,那个上传者现在已经移到这里了:github.com/FineUploader/fine-uploader
          猜你喜欢
          • 2011-10-21
          • 2016-09-14
          • 2014-10-29
          • 1970-01-01
          • 2012-01-19
          • 2020-10-21
          • 1970-01-01
          • 1970-01-01
          • 2011-07-08
          相关资源
          最近更新 更多