当前位置: 首页 > 知识库问答 >
问题:

javascript - JS 可否使用字符串传输文件?

施越彬
2023-09-07

在一个场景中,数据只能通过字符串传输,需要传文件或二进制对象时就比较麻烦。
目前使用将文件编码为base64传输,但是这种方式会时传输的数据增大(50K的文件编码后为80K)。测试使用浏览器的TextDecoder将文件编码为iso-8859-1,可以保持编码后字符串的大小和原文件一样,但是再转回文件时就转不回来了(TextEncoder只支持utf-8)
编码:

new TextDecoder('iso8859-1').decode(file);

====更新=====
现通过以下方式解码,但是zip压缩包会出现乱码

let buffer = new ArrayBuffer(textData.length);let arr = new Uint8Array(buffer);for(let i = 0; i < textData.length; i++){    arr[i] = textData.charCodeAt(i);}

image.png

请问是否还有其他方式可以实现?

共有1个答案

公西俊德
2023-09-07

用Blob对象:

function stringToBlob(str, contentType) {  return new Blob([new Uint8Array([...str].map(ch => ch.charCodeAt(0)))], { type: contentType });}const blob = stringToBlob(textData, 'application/zip');const url = URL.createObjectURL(blob);

用ArrayBuffer和DataView来控制二进制数据的读写:

function stringToArrayBuffer(str) {  const buffer = new ArrayBuffer(str.length);  const view = new DataView(buffer);  for (let i = 0; i < str.length; i++) {    view.setUint8(i, str.charCodeAt(i));  }  return buffer;}const buffer = stringToArrayBuffer(textData);

修复ISO-8859-1编码:

function encodeIso8859_1(arrayBuffer) {  const uint8Array = new Uint8Array(arrayBuffer);  return String.fromCharCode(...uint8Array);}function decodeIso8859_1(str) {  const uint8Array = new Uint8Array(str.length);  for (let i = 0; i < str.length; i++) {    uint8Array[i] = str.charCodeAt(i);  }  return uint8Array.buffer;}
 类似资料:
  • 问题内容: 这应该很容易:我想对文字字符串而不是输入文件运行 sed 。如果您想知道为什么,例如是编辑存储在变量中的值,而不必是文本数据。 当我做: 其中A,B,C是我要更改为A’,’B’,’C的文字 我懂了 好像它认为A,B,C是一个文件。 我试着用管道将其回显: 我得到提示。 正确的做法是什么? 问题答案: 您有单引号冲突,因此请使用: 如果使用bash,您也可以这样做(是): 但不是 因为期

  • 我有一个密码字段,我需要使用javascript检查它是否有以下字符: ! @ # $ % ^ 我试着这样做,结果正如预期的那样: 有没有更简单/有效的方法来做到这一点?

  • 根据不同的值,判断应该用什么元素,大佬们有什么方法优化一下呀

  • 我有一个Java 8项目,用Thymeleaf将数据带到前端。我想在前端输出的数据实体是calles,是一个包含json数据属性的实体列表。我将其输出到html文件中,如下所示: json具有以下结构: 但在页面上,它出现了双引号,这完全搞乱了js: 我如何防止json字符串中双引号的转义?我在另一个项目中使用php和twig,它就像一样简单。在thymeleaf中是否有某种修饰符,如php tw

  • 问题内容: 使用javascript,我有一个字符串文件(使用ajax请求获取)。 如何通过另一个Ajax请求将其作为文件上传到服务器? 问题答案: 您需要将request标头设置为,并稍微调整一下格式,我用PlainOl’JavaScript(tm)编写了此代码,但您可以轻松地将其改编为库: 编辑:现在喝了我的咖啡,所以将其修改为jQuery: