【问题标题】:How to get a blob from Javascript with Blazor如何使用 Blazor 从 Javascript 中获取 blob
【发布时间】:2021-03-16 22:09:50
【问题描述】:

我正在使用SixLabors.ImageSharp 使用 Javascript JQuery 裁剪图像,一切正常,但是当我需要裁剪图像时,我不知道如何在不刷新页面且不执行 POST 的情况下获取图像.

我正在使用Tutexchange 教程,他们通过 POST 方法获取图像(我不想那样做)我想运行一个方法并使用 Blazor 获取文件编码的 base64 但是当我这样做时无法获得reader.result,因为它位于 onloadend 事件中。 如何在没有 POST 方法且不将图像保存在文件夹中以使用 Blazor 读取的情况下获取图像 blob?

我尝试使用方法传递 onloadend reader.result 并使用 bucle 等待,而在完成时返回它,但值永远不会与 null 不同,我测试了裁剪器是否使用 console.log() 和一切都很好:

function InitializeCroppie(div_width, div_height) {
basic = $('#main-cropper').croppie
    ({
        enableExif: true,
        url: '/images/ChooseImage.png',
        viewport: { width: div_width, height: div_height },
        boundary: { width: div_width, height: div_height },
        showZoomer: false,
        format: 'png' //'jpeg'|'png'|'webp'
    });
//Reading the contents of the specified Blob or File
function readFile(input) {
    if (input.files && input.files[0]) {
        var reader = new FileReader();

        reader.onload = function (e) {
            $('#main-cropper').croppie('bind', {
                url: e.target.result
            });
        }
        reader.readAsDataURL(input.files[0]);
    }
}

// Change Event to Read file content from File input
$('#select').on('change', function () { readFile(this); });
}

var returnThisValue;
async function GetImageCroped() {
  returnThisValue = null;
  var blob = await basic.croppie('result', 'blob');
  var reader = new FileReader();
  if (blob != null) {
    reader.readAsDataURL(blob);
    reader.onloadend = function () {
        SetValue(reader.result);
        console.log(reader.result);
    }
  }

  while (returnThisValue == null) {
    //Waiting...
  }

  return returnThisValue;
}

function SetValue(value) {
  returnThisValue = value;
}

function GetImageValue() {
  return returnThisValue;
}

如果没有 POST 方法是不可能的,我如何在不重新加载页面的情况下接收它。

编辑: 我正在做一些测试,以了解 js 是否有可能让 blazor 知道何时将图像放入 localStorage 以使其与 Blazor 同步。 测试后:我尝试使用 Blazored.LocalStorage 获取图像,但 Chrome 无法解决“大数据”问题。

【问题讨论】:

  • 图片是用户上传的还是后台获取的?图片是什么时候上传到页面的? (打开页面时?)
  • 1)图片是从用户那里获取的。 2)用户将其放在容器上或选择图像后。
  • 为什么不用 blazor 的 InputFile 来上传文件呢? document你可以添加一个javascript事件。当用户选择文件时,blazor 调用这个 javascript。
  • @user1986237 是的,我可以使用它,但它不会帮助我从 Javascript 获取图像。 Javascript 方法获取当前图像并在将 Blob 转换为 base64 后对其进行裁剪。添加一个 InputFile 对我有什么帮助?如果我将从裁剪的图像中获得的源代码放入 InputFile,我可以将其放入 Blazor 的数据库中。这是你想说的还是你的另一个想法?
  • 它是基于你所指的code,因为我不知道你的blazor结构。

标签: javascript jquery asp.net-core blazor crop


【解决方案1】:

您可以添加 JavaScript 侦听器事件。更新本地存储时会触发另一个事件。它应该在页面初始化时加载。

var orignalSetItem = localStorage.setItem;
localStorage.setItem = function (key, newValue) {
    var setItemEvent = new Event("setItemEvent");
    setItemEvent.key = key;
    setItemEvent.newValue = newValue;
    window.dispatchEvent(setItemEvent);
    orignalSetItem.apply(this, arguments);
};
window.addEventListener("setItemEvent", function (e) {
    if (e.key == 'image') {
        var _this = localStorage.getItem("image")
        if (_this != e.newValue) {
            console.log(e.newValue)
            //call method which sends this blob
        } else {
            console.log('key->');
            console.log(e.newValue)
        }
    }
});

触发方法。

 $('#btnupload').on('click', function ()
{ 
    basic.croppie('result', 'blob').then(function (blob)
    {
        localStorage.setItem('image', blob)
        //...
    });
});

【讨论】:

  • 是的,这个答案是正确的,但是如果您测试您的代码,您会注意到无法使用 Blazor 检索图像,因为像 Google Chrome 这样的流行浏览器在从本地存储传递“大数据”方面存在问题。我也尝试在 Firefox 和 Microsoft Edge 中运行它,我遇到了同样的问题。
  • 我说是因为我尝试了类似的方法,但它不起作用。如果这种方法不能在谷歌浏览器中运行,我会放弃,因为大多数人使用谷歌浏览器。
  • 如果您使用 Blazor 测试了您的代码并且它可以正常运行,请纠正我。
  • @MAERT,请告诉我您的文件大小。因为我测试的文件不到1M。
  • 我用 623KB 的文件大小进行了测试。我使用 Blazored.LocalStorage 尝试从本地存储中获取 blob。您在 Blazor 方面使用了哪个库?图像已正确保存在 LocalStorage 中,但我无法获取。
猜你喜欢
  • 2017-10-19
  • 1970-01-01
  • 1970-01-01
  • 2019-03-26
  • 1970-01-01
  • 1970-01-01
  • 2019-11-21
  • 2023-03-31
  • 1970-01-01
相关资源
最近更新 更多