【问题标题】:Convert Image to Base64 and upload via AJAX将图像转换为 Base64 并通过 AJAX 上传
【发布时间】:2021-09-05 02:32:43
【问题描述】:

如何在不使用任何外部库的情况下将图像转换为 Base64 并通过 AJAX 发送进行处理?

简单的 HTML

<input type="file" id="image" accept="image/*">

AJAX

$(document).on('click', '.btn-report', function(e){
  e.preventDefault();
  var image = $("#image").val(); // I WANT TO CONVERT THIS INTO BASE64
  $.ajax({
    type: "POST",
    url: "processes/report.php",
    data: 'image='+image,
    cache: false,
    enctype: 'multipart/form-data',
    beforeSend: function(){
      $(".message").hide();
    },
    success: function(data){
      $(".message").html(data).fadeIn();
      $("html, body").animate({ scrollTop: 0 }, "slow");
    }
  });
});

有可能吗?如果是,怎么做?

【问题讨论】:

  • 第一个问题为什么要用Base64发送,这可能是XY problem。但是,如果您真的想将图像转换为 base64,您可以使用画布来实现 canvas to base64 on image src
  • @jcubic 那是因为我已经编写了一个 PHP 函数来使用croppie.js 上传base64 图像。我也想在这里使用相同的 PHP 函数而不使用croppie.js,并且不想为单个任务编写多个函数。
  • 然后就用canvas来绘制你的图片并获取数据url。
  • @jcubic 解释不起作用兄弟。你能用我的代码发布答案吗?

标签: jquery ajax image file-upload base64


【解决方案1】:

您需要使用 FileReader API 将文件读取为 base64 数据 URI:

$(send).on('click', () => {
    const reader = new FileReader();
    reader.addEventListener('load', (event) => {
        output.innerHTML = event.target.result;
    });
    reader.readAsDataURL(image.files[0]);
});
pre {
    white-space: pre-wrap;
    word-break: break-word;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="file" id="image" accept="image/*">
<button id="send">send</button>
<pre id="output"></pre>

编辑:

$(document).on('click', '.btn-report', function(e){
    e.preventDefault();
    const reader = new FileReader();
    reader.addEventListener('load', (event) => {
        var image = event.target.result;

        $.ajax({
            type: "POST",
            url: "processes/report.php",
            data: 'image='+image,
            cache: false,
            enctype: 'multipart/form-data',
            beforeSend: function(){
                $(".message").hide();
            },
            success: function(data){
                $(".message").html(data).fadeIn();
                $("html, body").animate({ scrollTop: 0 }, "slow");
            }
        });
    });
    reader.readAsDataURL($("#image")[0].files[0]);
});

【讨论】:

  • 这看起来像 Vanilla JS 代码。如何在我的代码中实现它?如您所见,我正在使用jquery..!
  • @ShubhamJha event.target.result 是一个带有base64编码数据的字符串,正如您在运行演示时所看到的那样,因此只需使用var image = event.target.result,并且您的ajax请求需要在加载函数中。
  • @ShubhamJha 另外,你不能让它比它更像 jQuery。 FileReader 是一个原生浏览器 API。
  • 没什么帮助。我的意思是,您的代码似乎可以工作,但我无法弄清楚如何将获得的 Base64 值放入我的图像变量中。这就是为什么我要求您在问题中使用我的代码展示一个示例。
  • @ShubhamJha 我已更新问题并将您的代码与我的代码复制粘贴(合并)。
【解决方案2】:

好的,所以我破解了最佳解决方案。对于将来寻找类似答案的任何人,都可以。

在 HTML 中添加一个新的隐藏输入字段,用于在每次图像更改时存储 Base64 字符串。

<input type="file" id="image" accept="image/*" onchange="encodeImgtoBase64(this)">
<input type="hidden" id="b64"> // THIS WILL CONTAIN THE BASE64 STRING

使用 File Reader 获取 Base64 字符串,并将字符串存储在上述字段中。

function encodeImgtoBase64(element) {
  var img = element.files[0];
  var reader = new FileReader();
  reader.onloadend = function() {
    $("#b64").val(reader.result);
  }
  reader.readAsDataURL(img);
}

最后,我们将根据点击按钮执行一个简单的 AJAX 调用。

$(".btn-report").on("click", function(e){
  e.preventDefault();
  var form = $(this).closest("form");
  var image = encodeURIComponent($('#b64').val());
  $.ajax({
    type: "POST",
    url: form.attr('url'),
    data: 'image='+image,
    cache: false,
    success: function(data){
      // YOUR CODES HERE
    }
  });
});

完成!永远解决!享受:D

【讨论】:

  • 我认为您的代码将永远无法工作,因为您甚至需要在更改时添加 encodeImgtoBase64 并且您将遇到竞争条件。它可能会上传以前的文件,因为该文件尚未转换(fileReader 是异步的)。
  • 你在做什么?我在清除所有测试后发布了我的答案。在发布答案之前,我已经“尝试并测试过”它,但您会“思考”。它按预期工作得很好(正如我所希望的那样)。相反,你似乎从来没有正确理解我的问题,你的答案也不是我想要的。请再次阅读我的问题,然后查看我的答案以了解它们之间的关系、我想要什么以及为什么我的答案有效。
  • 如果你快速点击你可能会破坏你的代码。例如,如果您使用不等待的自动化测试,它将中断。
  • 点击快什么?用户将点击浏览按钮,从他的手机中选择一张图片然后上传。这个过程需要时间。
  • 它看起来像竞态条件,它可能会失败,只要看看这个代码点击立即运行,编码代码是异步的,并在点击时立即发送编码图像。代码看起来坏了。 reader.onloadend 不会在你点击按钮的同时被调用。 Base64 的处理可能需要 timem,但您无需等待 Base664 图像被解码,而是立即将其发送到服务器。因此,您最终可能会发送空请求,或者当您发送下一个请求时,您可能会发送上一个文件。这不是您编写异步代码的方式。它可能会起作用,但只是由于浏览器的错误而可能会失败。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-09
  • 2013-10-20
  • 2019-09-07
  • 1970-01-01
  • 2014-04-06
  • 2017-09-12
相关资源
最近更新 更多