Blob.slice() 取得的是檔案的一段位元組。它不會把圖片裁成較小尺寸,也不會重新編碼。讀取圖片檔頭時,應把結果當成待檢查的檔案片段。
例如 file.slice(0, 16) 會取得前 16 個位元組,結束位置 16 不包含在結果內。如果檔案不足 16 個位元組,結果只含實際存在的資料。接著可用 await header.arrayBuffer() 讀取這段資料,這裡的 header 就是剛取得的 Blob。
檔頭比對只能作為前置線索。符合某種檔案特徵,不代表整個圖片能成功解碼,也不代表檔案符合上傳限制。不要把通過短檔頭檢查直接當成解碼成功;完整解碼與伺服器檢查仍須各自處理。
slice() 的第三個參數 contentType 只是設定新 Blob 的 type。把它寫成 image/jpeg,不會把原始 HEIC 或 PNG 位元組轉成 JPEG。若要轉檔,需要真正的解碼及重新編碼步驟。
測試可以用已知內容的 Blob,分別檢查起點、終點及短檔案。例如四個位元組的資料取 slice(0, 2),結果應保留前兩個位元組。將位元組範圍與圖片格式判斷分開測試,避免兩種錯誤混在一起。
參考:https://developer.mozilla.org/en-US/docs/Web/API/Blob/slice