【问题标题】:compress images before uploading using jquery file upload使用jquery文件上传在上传之前压缩图像
【发布时间】:2019-02-12 19:10:06
【问题描述】:

我使用jquery file upload plugin 直接上传到s3,我试图在上传之前压缩图像,我尝试了imageQuality: 0.8 选项

fileInput.fileupload({

            fileInput:       fileInput,
            url:             my_url
            type:            'POST',
            paramName:        'file',
            dataType:         'XML',
            replaceFileInput: false,
            acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i
            maxFileSize: 999000,  
            imageQuality: 0.8,

            // .....

})

但是上传后图片大小没有被压缩

我不确定 imageQuality 在这里是否正确,但我也愿意接受任何其他选择:

例如:我还创建了自己的函数来压缩图像,该函数返回图像 Blob,我只是不知道如何告诉 JQuery 文件上传使用该 blob 而不是输入文件中的图像

【问题讨论】:

    标签: jquery jquery-file-upload


    【解决方案1】:

    我将在找到解决方案后回答我的问题,希望这对将来的某人有所帮助:

    要使用 jquery 文件上传压缩图像,有两种解决方案,要么使用插件提供的压缩,要么创建自己的压缩函数并将其与 jquery 文件上传一起使用,我最终使用了第二种解决方案

    第一个解决方案:

    我偶然发现了这个链接:https://github.com/blueimp/jQuery-File-Upload/wiki/Client-side-Image-Resizing

    所以你需要做的基本上是在你的项目中导入以下文件:jquery.js, jquery.ui.widget.js, load-image.all.min.js, canvas-to-blob.min.js, jquery.iframe-transport.js, jquery.fileupload.js, jquery.fileupload-process.js, jquery.fileupload-image.js

    然后查看jQuery File upload的选项,发现imageQuality选项,看了看,上面写着:

    imageQuality:设置给 canvas.toBlob() 调用时的质量参数 保存调整大小的图像。

    所以似乎 imageQuality 选项仅在图像调整大小时才有效,但在我的情况下,我不需要调整图像大小,但您可以使用另一个选项 imageForceResize,通过结合这两个选项可以使压缩工作,但是需要第三个选项disableImageResize,该选项默认设置为true,因此我们需要将其设置为false以允许调整图像大小。

    最终代码如下所示:

    $('#file_input').fileupload({
    
        # these 3 options are necessary together for compressing
        disableImageResize: false,
        imageForceResize: true,
        imageQuality: 0.7,
        // ......
    })
    

    对于第二种解决方案:

    如果你想使用自己的压缩功能,我认为这是最好的方法,那么在这种情况下你只需要jquery.js, jquery.ui.widget.js, jquery.fileupload.js

    jquery文件上传在提交之前将要上传的文件存储在data.files中,所以你要做的是有一个压缩图像并返回一个blob数组的函数,然后覆盖data.files

    $('#file_input').fileupload({
    
       add: function(e, data){
           // .......
           data.files = compress_images_function()
           data.submit()
       }
    
    })
    

    【讨论】:

    • 我不知道我做错了什么,但是当我应用此文件上传时,当我单击选择文件并选择一个文件时。它什么也不做,仍然没有选择文件。我在表单上设置了这个#file_input 东西。我应该检查哪一部分。谢谢
    • @KevinFarel 这是不言自明的,#file_input 我的意思是<input type="file" id="file_input">,尝试将文件上传应用到您的输入按钮而不是表单
    • blueimp file upload documentation 表示将质量级别传递给 canvas.toBlob。 That documentation 反过来说 Safari 和 Chrome for Android(和 IE 11)不支持质量设置,caniuse agrees 很糟糕。我想知道是否有任何其他方法可以改变它。好像有点低。
    • @cesoid 如果我记得我使用某种客户端 (js) 解决方案来压缩我的图像,但我不记得该解决方案是否也使用 canvas.toBlob,你可以在 github 上搜索解决方案并使用我描述的第二种方式,另一个很酷的解决方案是使用imgproxy.net,您可以将其安装在您的服务器中,他们有一个开源版本,网上也有其他类似的解决方案
    猜你喜欢
    • 2021-01-03
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-04
    • 2018-10-06
    • 2018-02-17
    相关资源
    最近更新 更多