【问题标题】:Inject cropped file as input:file value注入裁剪文件作为输入:文件值
【发布时间】:2017-04-18 07:17:45
【问题描述】:

我正在使用 jQuery Croppie 库来裁剪用户上传的文件。当用户上传文件时,我正在打开用户可以裁剪图像的模式。之后,我想将此裁剪后的图像设置为文件输入值,以便用户可以在一切准备就绪后提交表单,但我不知道如何将裁剪后的图像“设置”为输入值。

这是我的代码。

$scope.openCropModal = function(files) {
            if (!(files[0] instanceof Object) || (fileUploadMaxSize * 1100000) < files[0].size) {
                Alertify.alert('File size must be less than ' + fileUploadMaxSize + 'mb');

                return false;
            }
            $('#cropLogoModal').modal({});

            var $uploadCrop = $('#cropperMainContainer').croppie({
                viewport: {
                    width: 200,
                    height: 200,
                    type: 'square'
                },
                boundary: {
                    width: 300,
                    height: 300
                },
                enableExif: true,
                enableOrientation: true,
                orientation: 4,
            });

            var reader = new FileReader();

            reader.onload = function (e) {
                $uploadCrop.croppie('bind', {
                    url: e.target.result
                }).then(function() {

                });

            };

            reader.readAsDataURL(files[0]);

            $('#ready').on('click', function() {
                $uploadCrop.croppie('result', 'blob').then(function(blob) {

                });
            });

            $('.vanilla-rotate').on('click', function() {
                $uploadCrop.croppie('rotate', parseInt($(this).data('deg')));
            });
        }

【问题讨论】:

  • 您如何发送此表格?通过 ajax 或默认 HTML 操作?
  • 默认 HTML 表单提交
  • 太糟糕了...那么骇人听闻的 dataURI 空字段是您唯一的方法...对于可以通过 ajax 发送的未来读者,创建一个 FormData 对象并在其中附加您的 blob 版画布,所以它作为多部分上传,就像任何二进制数据一样。
  • Ps:您不能以编程方式更改输入类型文件的值,除非重置它。

标签: javascript jquery image croppie flatfilereader


【解决方案1】:

不要将其作为文件附件,而是为 bas64 编码的 blob 数据创建隐藏字段。

        var reader = new FileReader();

        reader.onload = function (e) {
            $uploadCrop.croppie('bind', {
                url: e.target.result
            }).then(function(blob) {
                $('#hiddenContent').val(btoa(blob));
            });
        };

在服务器端,读取这个 base64 编码的图像内容并将其放入新文件。

警告代码未测试。

【讨论】:

  • 如果表单是通过ajax发送的,这个方案真的很丑!
  • @Kaiido 是的,因为您已经拥有可以与 FormData 一起使用的 FileReader 对象,但 OP 正在使用 默认 HTML 表单提交
  • 第一部分不应该:OP 正在使用 FileReader 将其文件传递给croppy lib(顺便说一句,我想知道它是否不直接接受 Blob,或者至少是 blobURI)但是 lib似乎返回一个 Blob,所以是的,FormData 肯定是这里的最佳选择。而且不清楚 OP 是否使用默认的 HTML 表单提交,我可能在原始帖子中错过了它。
  • 哦,如果 lib 的返回值真的是 Blob 对象,那么您的代码将无法工作:btoa(blob) => 'W29iamVjdCBCbG9iXQ==' ;-)
  • 我的库返回 base64 以及 blob。我只是想知道是否可以仅使用我的文件输入来做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-04
  • 2016-11-28
  • 1970-01-01
相关资源
最近更新 更多