0

我将如何调试我认为是 Base64 格式的字符串有什么问题,但在 VB 中使用下面的代码行

Dim theImage As Drawing.Image = imageUtils.Base64ToImage(teststring)

抛出以下异常?

{"Base64ToImage(): The input is not a valid Base-64 string as it contains a 
non-base 64 character, more than two padding characters, or an illegal 
character among the padding characters. "}

测试字符串本身太长,无法粘贴到这里;我试过但达到(很多)超过字符限制。我尝试了一些在线转换工具,但它似乎也不起作用。起初,我以为我将 ajax 调用中的字符串错误地传递给了后面的 web 方法 VB 代码……但我也尝试将字符串硬编码到函数中,但同样失败。所以,我确信字符串本身是坏数据。

看起来像:

Dim teststring = "dataImage/ png;base64, 
iVBORw0KGgoAAAANSUhEUgAAB4AAAAQ4CAYAAADo08FDAAAgAElEQVR4Xuy9268sWbbe9UVE3i / 
rvte + V....K/1Tx5/8A736wVclDQN4AAAAASUVORK5CYII="

但我也尝试删除“dataImage”部分并使用

Dim teststring = 
"iVBORw0KGgoAAAANSUhEUgAAB4AAAAQ4CAYAAADo08FDAAAgAElEQVR4Xuy9268sWbbe9UVE3i / 
rvte + V....K/1Tx5/8A736wVclDQN4AAAAASUVORK5CYII="

这并没有什么不同。

我正在使用此函数在 javascript 中获取此字符串:

btnFreeze.onclick = video.onclick = function (e) {
                e.preventDefault();
                canvas.width = video.videoWidth;
                canvas.height = video.videoHeight;
                canvas.getContext('2d').drawImage(video, 0, 0);
                alert("got here");
                $hfLicenseScreenshot.val(canvas.toDataURL());
                $img.css("background-image", "url(" + $hfLicenseScreenshot.val() + ")");
                $("#hiddenTextbox").val($hfLicenseScreenshot.val());
                //$("#save").show();
                return false;
            };

...最终字符串来自哪里

canvas.toDataURL()

大约在该函数的一半处,有一个名为 $hfLicenseScreenshot 的隐藏字段,我从中将值保存到“隐藏”文本框中(我不知道为什么我的变量会丢失,我知道它是多余的,但这就是我保存值的原因到一个名为 hiddentextbox 的文本框。我稍后从 hiddentextbox 获取字符串,例如:

$("#hiddenTextbox").val().toString();

所以,我不知道如何调试这个基于 64 位的图像字符串。我尝试了从我的网络摄像头拍摄的不同图像,但它们都无法使用。有任何想法吗?

...我不知道它是否被序列化,因为我认为 JSON stringify 方法应该这样做。我可能在那里感到困惑。

...这是我的 ajax 调用:

$.ajax({
    type: "POST",
    url: "/BackCode/FirstPage.aspx/SaveData",
    data: JSON.stringify({ currentData: currentData, str: makeblob(str) }),
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    async: true,
    currentData: currentData,
    success: function (resp) {
        resp = resp.d;
        if (resp.success) {
            if (typeof callback === "function")
                callback.apply(this, [resp]);
            load();

        } else {
            $.statusMessage(resp.statusMessage, "red");
        }
    },
    error: function (jsonObject, textStatus, errorThrown) {
        $.statusMessage(errorThrown, "red");
    }
});

我也遇到了这个问题,它经常进入最后一个错误函数:

$.statusMessage(errorThrown, "red");

所以我也不知道我是否正确传递了它。

4

2 回答 2

0

以下对我有用:

Dim base64String = "Qk2uAAAAAAAAADYAAAAoAAAABgAAAAYAAAABABgAAAAAAAAAAADEDgAAxA4AAAAAAAAAAAAA////AAAAAAAAAAAAAAAA////AAAAAAD///////////////8AAAAAAP///////////////////////wAA////////////////////////AAD///8AAAD///////8AAAD///8AAP///////////////////////wAA"

Dim base64Bytes = Convert.FromBase64String(base64String)

Using memoryStream = New MemoryStream(base64Bytes)
    Dim image As Image = Image.FromStream(memoryStream)
    image.Save($"C:\Users\{Environment.UserName}\Desktop\Smile.bmp")
End Using

我已经删除了指示它是什么类型的图像的初始元数据,原始字符串是:

data:image/bmp;base64,Qk2uAAAAAAAAADYAAAAoAAAABgAAAAYAAAABABgAAAAAAAAAAADEDgAAxA4AAAAAAAAAAAAA////AAAAAAAAAAAAAAAA////AAAAAAD///////////////8AAAAAAP///////////////////////wAA////////////////////////AAD///8AAAD///////8AAAD///8AAP///////////////////////wAA

尝试从您的 base64 编码中删除空格 - 因为它们不是有效的 base64 字符 - 并从一开始就删除元数据。

以下是取自 Wikipedia 的有效 base64 字符: 有效的 Base64 字符

于 2019-08-22T20:06:33.300 回答
0

我尝试像这里的其他一些建议一样删除空格,但这并没有解决我的问题(尽管我确信这可能是次要问题)。

在我的例子中,我的字符串实际上根本不是一个有效的图像,因为我试图将它作为对象从 Ajax 传递到 VB WebMethod(这是因为作为字符串传递不起作用)。在某一时刻,我曾尝试将其转换为 Blob 对象……所以我的测试字符串完全无效。我应该把它作为一个字符串留在前端和后端。所以,我什至不知道我之前发布的字符串是什么,但它不是图像。

最终我意识到我在前端的字符串太长了,这是我的实际/原始问题。现在我意识到之前提到的字符串太长而无法在我的问题中发布具有讽刺意味。您可以在 WebConfig 中为图像字符串的最大长度设置一些内容:

<webServices>
    <jsonSerialization maxJsonLength="86753010">
    </jsonSerialization>
</webServices>

所以,json 序列化失败了,因为我把这段代码注释掉了。我重新评论它并使数字更大,这解决了我的问题。因此,我能够正确传递字符串并且一切正常!

于 2019-08-23T12:12:12.237 回答