相关疑难解决方法(0)

JavaScript BLOB 出来的比输入大得多

我们通过拖放变量(使用 dropzone.js - 在此阶段它是 base64 加上用于指定文件类型的字符)来接收本地文件(通常是 PDF、PNG 或 JPG)。我们将它(现在是二进制的)加密到一个 javascript 变量中。然后我们使用该变量创建一个 Blob 并将其上传到运行 PHP 的服务器。(请参阅我们了解如何将 js 变量发送到 PHP $_FILE。)

我们发现 blob 的 .size 比我们上传的文件的 .length 大 50% 左右。(我们一直通过转换为 base64 然后使用 JSON 上传,但我们希望改变的一个原因是希望避免使用 base64 时大小增加 33%。)

从中等尺寸到较大尺寸,斑点始终大约 50%。作为一个小测试,我们使用 120 个字符作为输入创建了一个 Blob,发现 Blob.size 为 210。(我们通常使用正确的 file.type;image/png 只是为了让它被解释为没有的二进制数据)不需要编码。)从我们代码中的实际使用来看:我们上传了一个 900K 的 PDF 文件。类型类似于“应用程序/pdf”。由此产生的 blob 就像 1,400K。也尝试过 PNG。

我认为 Blob 应该与输入的大小相同,不是吗?我们可能做错了什么?

new Blob(["123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"], {type:"image/png"});
Run Code Online (Sandbox Code Playgroud)

javascript

8
推荐指数
1
解决办法
8340
查看次数

Node.js将ISO8859-1编码为UTF-8

我有一个应用程序,允许用户将字符串持久化到数据库,这些字符串可能包含表情符号.我遇到的问题是表情符号,例如 will get stored in MySQL as 😊

当我使用PHP MySQL客户端检索此字符串并在Web浏览器中呈现它时,它可能因为Content-Type设置为UTF-8 而呈现得很好.当我尝试读取node.js中的字符串时,我回想起我认为ISO8859-1编码的文字😊.桌子上的字符集设置为latin1,这就是我从中获取ISO8859-1的地方.

在node.js中对字符串进行编码的正确方法是什么,以便在字符串中我可以看到表情符号而不是MySQL设置的编码console.log

mysql unicode utf-8 iso-8859-1 node.js

7
推荐指数
2
解决办法
2612
查看次数

使用axios post捕获错误正文

我正在从带有响应正文的后端代码发送状态代码422,其中包含错误的描述。我使用axios发布如下,以发布请求:

post: function(url, reqBody) {
    const request = axios({
        baseURL: config.apiUrl,
        url: url,
        headers: {
            'Content-Type': 'application/json',
            'Authorization': sessionStorage.getItem('token')
        },
        method: 'POST',
        data: reqBody,
        responseType: 'json'
    });
    return request
        .then((res) => {
            return res;
        })
        .catch((error) => {
            console.log(error);
            return error;
        })
}
Run Code Online (Sandbox Code Playgroud)

问题是当后端返回错误代码422时,我正在捕获的错误对象没有有关响应主体的信息。有什么方法可以检索错误文本?

javascript post axios

7
推荐指数
5
解决办法
4421
查看次数

如何将 UTF8 ArrayBuffer 转换为 UTF16 JavaScript 字符串

这里的答案让我开始了解如何使用 ArrayBuffer:

在字符串和 ArrayBuffers 之间转换

但是,他们有很多不同的方法。主要是这样的:

function ab2str(buf) {
  return String.fromCharCode.apply(null, new Uint16Array(buf));
}

function str2ab(str) {
  var buf = new ArrayBuffer(str.length*2); // 2 bytes for each char
  var bufView = new Uint16Array(buf);
  for (var i=0, strLen=str.length; i<strLen; i++) {
    bufView[i] = str.charCodeAt(i);
  }
  return buf;
}
Run Code Online (Sandbox Code Playgroud)

我想澄清一下 UTF8 和 UTF16 编码之间的区别,因为我不是 100% 确定这是正确的。

所以在 JavaScript 中,据我所知,所有字符串都是 UTF16 编码的。但是您在自己的 ArrayBuffer 中可能拥有的原始字节可以采用任何编码。

所以说我已经从 XMLHttpRequest 向浏览器提供了一个 ArrayBuffer,来自后端的那些字节是 UTF8 编码的:

var r = new XMLHttpRequest()
r.open('GET', '/x', …
Run Code Online (Sandbox Code Playgroud)

javascript encoding utf-8 arraybuffer

7
推荐指数
1
解决办法
1691
查看次数

如何将javascript数组转换为二进制数据并返回websocket?

我想发送这个示例数组

[{
    id: 1,
    name: "test",
    position: [1234,850], //random position on the map
    points: 100 //example points
}];
Run Code Online (Sandbox Code Playgroud)

到我的websocket服务器作为二进制数据.在服务器端,我希望将二进制数据解码回数组,进行更改并将二进制数据发送回客户端.最后在客户端如何将二进制数据解码回数组?

截屏示例我的意思是:

在此输入图像描述

这是我的实际代码:

var connection = new WebSocket('wss://my_website.eu:1234');
connection.binaryType = "ArrayBuffer";
connection.onmessage = function (event) {

    // console.log(event);
    if (event.data instanceof window["ArrayBuffer"]) {
        var data3 = JSON.parse(String.fromCharCode.apply(null, new Uint16Array(event.data)));
        console.log(data3);
    } else {
        console.log(event.data); // Blob {size: 0, type: ""}
    }
};

$("body").mousemove(function( event ) {

    var data = {
        name: "lol",
        pos: [event.pageX, event.pageY]
    };

    //convert to binary frame
    var data2 …
Run Code Online (Sandbox Code Playgroud)

javascript websocket

6
推荐指数
1
解决办法
1万
查看次数

使用本机 javascript / 微妙加密使用 RSA 加密

我正在尝试关注以下网络文档subtleCrypto

https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/encrypt

要使用 RSA-OAEP,请传递 RsaOaepParams 对象。

RSA密钥应该如何格式化?以下代码仅使用纯文本rsaPublicKeyrsaPrivateKey:应如何更改它们

let rsaPublicKey = "ssh-rsa AAAAB3 ..."

function encrypt(rsaPublicKey, msg) {
    let emsg = new TextEncoder().encode(msg)
    let encrypted = crypto.subtle.encrypt(
        {
            name: "RSA-OAEP"
        },
        rsaPublicKey,
        msg
    );
    return encrypted
}
Run Code Online (Sandbox Code Playgroud)
let rsaPrivateKey = "MIIEvQIBADU ..."
function decrypt(rsaPrivateKey, encrypted) {
  return window.crypto.subtle.decrypt(
    {
      name: "RSA-OAEP"
    },
    rsaPrivateKey,
    encrypted
  );
}
Run Code Online (Sandbox Code Playgroud)

这是尝试进行往返的(可能不正确)代码:

let enc = encrypt(rsaKey, "hello world!") // ERROR on this line
console.log(enc)
let dec = decrypt(rsaPrivateKey, enc) …
Run Code Online (Sandbox Code Playgroud)

javascript encryption

6
推荐指数
1
解决办法
1741
查看次数

加密微妙解密参数未键入“CryptoKey”

我正在尝试使用预先生成的SubtleCrypto解密字符串

我没有得到解密的文本,而是收到错误:无法在“SubtleCrypto”上执行“解密”:参数 2 不是“CryptoKey”类型。

console.log(window.crypto.subtle.decrypt({name:"AES-CBC", iv:""}, "1234567890123456", "i4+WxNH8XYMnAm7RsRkfOw=="));
Run Code Online (Sandbox Code Playgroud)

我尝试研究该错误,但没有遇到与这样一个基本示例相关的任何内容。我究竟做错了什么?

javascript encryption subtlecrypto

6
推荐指数
1
解决办法
5573
查看次数

如何使用 Web Crypto API 创建哈希?

我正在尝试在客户端创建 SHA-1 哈希。我正在尝试使用 Web Crypto API 来做到这一点,但是当我将输出与各种在线工具给我的输出进行比较时,结果完全不同。我认为问题在于 ArrayBuffer 到 Hex 的转换。这是我的代码:

function generateHash() {
            var value = "mypassword";
            var crypto = window.crypto;
            var buffer = new ArrayBuffer(value);
            var hash_bytes = crypto.subtle.digest("SHA-1", buffer);
            hash_bytes.then(value => document.write([...new Uint8Array(value)].map(x => x.toString(16).padStart(2, '0')).join('')));
        }
Run Code Online (Sandbox Code Playgroud)

的输出document.write应该是:

91dfd9ddb4198affc5c194cd8ce6d338fde470e2
Run Code Online (Sandbox Code Playgroud)

但事实并非如此,我得到了不同长度的完全不同的哈希值(应该是 40)。我可以就这个问题提供一些建议吗?谢谢。

javascript cryptography ecmascript-6 webcrypto-api

6
推荐指数
1
解决办法
4489
查看次数

nodejs二进制websocket模仿类型处理

我不是100%肯定,但是从我通过websocket发送blob(二进制数据)时看到的内容来看,该blob不包含任何文件信息。(此外,官方规范指出,wesockets仅发送原始二进制文件)

  1. 文件大小
  2. 模仿型
  3. 用户信息(稍后解释)

我正在使用https://github.com/websockets/ws

测试:

直接从输入文件发送Blob。

ws.send(this.files[0]) //this should already contain the info
Run Code Online (Sandbox Code Playgroud)

通过设置适当的mimetype文件,使用本地javascript api创建一个新的blob。

ws.send(new Blob([this.files[0]],{type:this.files[0].type})); //also this
Run Code Online (Sandbox Code Playgroud)

双方都只能获得有效的斑点,而没有任何其他信息。

是否有可能追加一个4kb的预定义json数据,该数据也转换为包含mimetype和filesize等重要信息的二进制文件,然后在需要时将其拆分为4kb?

{“ mime”:“ txt /纯文本”,“大小”:345} ____________ 4KB_REST_OF_THE_BINARY

要么

ws.send({"mime":"txt\/plain","size":345})
ws.send(this.files[0])
Run Code Online (Sandbox Code Playgroud)

即使第一个是最糟糕的解决方案,它也可以让我一次发送所有内容。

第二个有一个大问题:

这是一个聊天记录,允许同时发送文档,图像,音乐视频等文件。

在发送二进制数据之前,我可以在发送文件/用户信息时编写某种握手系统。

如果另一个人也发送了一个文件,因为它是异步的,则握手系统没有机会确定该文件对于正确的用户和模仿类型是正确的。

那么,如何在多用户异步环境中正确发送二进制文件?

我知道我可以转换为base64,但那要大30%。

顺便说一句 完全让Apple感到失望 ...虽然chrome可以正确显示每个二进制数据,但我的ios设备无法处理blob,只有图像将以blob或base64格式显示,甚至没有简单的txt文件。基本上只有<img>标签可以读取动态文件。

一切运作方式(现在):

  1. 用户发送文件
  2. nodejs获取二进制数据以及用户信息,但不是mimetype,filename,size。
  3. nodejs将原始二进制文件广播给所有用户。(无法指定用户和文件信息)
  4. 客户创建一个Bloburl(谁发送的?XD)。

编辑

我现在所拥有的:

客户端1(发送文件)

fileInput.addEventListener('change',function(e){
 var file=this.files[0];
 ws.send(new Blob([file],{
  type:file.type //<- SET MIMETYPE
 }));
 //file.size
},false);
Run Code Online (Sandbox Code Playgroud)

注意:file已经是blob了……但是,这通常是您创建指定mimetype的新blob的方式。

服务器(将二进制数据广播到其他客户端)

aaaaa和mimetype消失了...

ws.addListener('message',function(binary){
 var b=0,c=wss.clients.length;
 while(b<c){
  wss.clients[b++].send(binary) …
Run Code Online (Sandbox Code Playgroud)

javascript binary blob websocket node.js

5
推荐指数
1
解决办法
1942
查看次数

JSON 中的二进制数据

我正在网站的客户端使用 javascript 代码来解析混合字符串/原始数据,这些数据通过 http POST 响应通过 JSON 对象接收。

该 JSON 对象的某些字段是文本/数字,但最大且最重要的字段(性能方面)是由原始数据(八位字节)组成的原始字段。

如何将该字段转换为Float64Array()对象,以便我可以使用纯现代 JavaScript 解析数据,并考虑到性能?

javascript json typed-arrays

5
推荐指数
1
解决办法
1万
查看次数