首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >读取js中的文件将会损坏文件。

读取js中的文件将会损坏文件。
EN

Stack Overflow用户
提问于 2020-07-31 22:58:19
回答 2查看 61关注 0票数 2

在js中,我正在运行以下代码

代码语言:javascript
复制
let str = new TextDecoder("utf8").decode(new Uint8Array(reader.result));

let data = {
    name:file.name,
    size: args.loaded,
    contentsize:str.length,
    type:file.type,
    content:str
};
let res = await $.post({
    url:"/api/files",
    data:JSON.stringify(data),
    processData: false,
    contentType: "application/json",
})

reader.result是的输出

代码语言:javascript
复制
reader.readAsArrayBuffer(file);

,然后在php中提取。

代码语言:javascript
复制
$new["actual"] =strlen($new["content"]);
$new["content"] = new MongoDB\BSON\Binary($new["content"] ,MongoDB\BSON\Binary::TYPE_GENERIC);
$result = IO::$db->files->insertOne($new);

,然后生成一个db文档。

代码语言:javascript
复制
{ 
    "name" : "test.pdf", 
    "size" : NumberInt(128454), 
    "contentsize" : NumberInt(122693), 
    "type" : "application/pdf", 
    "actual" : NumberInt(215693)
}

但是,当我将文件内容移回文件系统时,文件已损坏,无法打开。我已经运行了VSCode附带的文件比较器,显示DB内容和原始内容之间没有任何差异,所以我只能认为问题出在文件大小和读取内容上的3kb差异,但我想不出是什么原因

注意似乎只是二进制文件

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-15 20:04:36

UTF-8规范没有包含字节数据范围内所有位代码的字符,其他语言通过添加特殊的非UTF-8字符来完成字节码映射来解决这个问题,但在JavaScript中并非如此

所以这是JavaScript的局限性,它不会告诉你它已经命中了一个字节码,它不能反序列化,这将突出显示一个问题已经发生,它只是跳过那个字节,然后移到下一个字节,损坏你的数据并隐藏为什么会发生损坏。

这意味着您不能使用JavaScript中的UTF-8编码器对包括不支持的字节代码之一的任何内容进行编码。要解决此问题,可以将字节转换为十六进制字符串,然后在服务器端使用该字符串进行反序列化。这会导致一定程度的数据膨胀,因为您使用2个字节发送一个字节(尽管这比尝试对字节数组进行编码要少得多),但是由于2个字母的十六进制字符串映射所有字节范围值,这意味着二进制数据不会损坏,并且可以通过JavaScript安全地用于基于文本的数据序列化(如JSON

票数 0
EN

Stack Overflow用户

发布于 2020-07-31 23:49:33

您的示例是一个PDF文件。PDF文件不是文本文件,不应作为文本文件处理。如果更改行尾,这将更改文件中不同对象的偏移量,从而损坏PDF文件。更糟糕的是,如果PDF文件中有二进制流(例如字体、图像等),它将破坏流的内容,并可能使其无法解码。

要解决此问题,请确保将PDF文件读写为二进制文件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63194301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档