亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 js 中讀取文件會損壞文件

在 js 中讀取文件會損壞文件

PHP
繁星淼淼 2023-09-08 17:04:54
在 js 中我正在運行這段代碼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 的輸出reader.readAsArrayBuffer(file);然后在 php 中獲取$new["actual"] =strlen($new["content"]);$new["content"] = new MongoDB\BSON\Binary($new["content"] ,MongoDB\BSON\Binary::TYPE_GENERIC);$result = IO::$db->files->insertOne($new);然后會產生一個數據庫文檔{     "name" : "test.pdf",     "size" : NumberInt(128454),     "contentsize" : NumberInt(122693),     "type" : "application/pdf",     "actual" : NumberInt(215693)}但是,當我將文件內容刪除回文件系統時,文件已損壞并且無法打開。我已經運行了 VSCode 附帶的文件比較器,并說數據庫內容和原始內容之間有 0 差異,所以我只能認為問題在于文件大小和讀取內容的 3kb 差異,但是什么或者為什么我無法逃脫注意似乎只是二進制文件
查看完整描述

2 回答

?
天涯盡頭無女友

TA貢獻1831條經驗 獲得超9個贊

您的示例是 PDF 文件。PDF 文件不是文本文件,不應作為文本文件處理。如果更改行結尾,這將更改文件中不同對象的偏移量,從而損壞 PDF 文件。更糟糕的是,如果 PDF 文件中存在二進制流(例如字體、圖像等),則會破壞流的內容,并可能導致無法對其進行解碼。

要解決此問題,請確保將 PDF 文件作為二進制文件進行讀取和寫入。


查看完整回答
反對 回復 2023-09-08
?
拉丁的傳說

TA貢獻1789條經驗 獲得超8個贊

好的,UTF-8 規范并不包含字節數據范圍內所有位代碼的字符,其他語言(例如 PHP)通過添加完成字節代碼映射的特殊非 UTF-8 字符來解決此問題,但事實并非如此在 JavaScript 中

所以這是 JavaScript 的限制,它不會告訴你它已經命中了一個字節碼,它無法反序列化,這會突出顯示發生了問題,它只是跳過該字節并移動到下一個字節,從而破壞了你的數據并隱藏腐敗發生的原因。

這意味著您不能在 JavaScript 中使用 UTF-8 編碼器對包含不支持的字節碼之一的任何內容進行編碼,要解決此問題,可以選擇將字節轉換為十六進制字符串,然后使用它來解碼在服務器端進行序列化,這會導致一定程度的數據膨脹,因為您使用 2 個字節發送一個字節(盡管這比嘗試對字節數組進行編碼要少得多),但由于 2 個字母的十六進制字符串映射所有字節范圍值意味著二進制數據不會損壞,并且可以安全地用于基于文本的數據序列化(例如通過 JavaScript 的 JSON)


查看完整回答
反對 回復 2023-09-08
  • 2 回答
  • 0 關注
  • 185 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號