TYEYDY

快樂生活 | 身體健康

0%

PHP ZipArchive 壓縮檔案數量不正確

問題

上傳了一個縮檔檔 (file.zip),內包含兩個圖片

使用程式碼解壓縮,逐一上傳到伺服器

1
2
3
4
$zip = new \ZipArchive();
for ($i = 0; $i < $zip->numFiles; $i++) {
// 上傳檔案
}

但發現 $zip->numFiles 的數量不正確,有四個檔案

查詢所有的$ file_name,發現有兩個檔案是 __MACOSX/._ 開頭的檔案

1
2
3
4
$zip = new \ZipArchive();
for ($i = 0; $i < $zip->numFiles; $i++) {
$stat = $zip->statIndex($i);
}
1
2
3
4
local.INFO: stat [{"name":"pic1.jpg","index":0,"crc":386404580,"size":42992,"mtime":1714363176,"comp_size":38074,"comp_method":8,"encryption_method":0}]
local.INFO: stat [{"name":"__MACOSX/.pic1.jpg","index":1,"crc":44379887,"size":340,"mtime":1714363176,"comp_size":197,"comp_method":8,"encryption_method":0}]
local.INFO: stat [{"name":"pic2.jpg","index":2,"crc":1810608204,"size":13140,"mtime":1714361602,"comp_size":9669,"comp_method":8,"encryption_method":0}]
local.INFO: stat [{"name":"__MACOSX/.pic2.jpg","index":3,"crc":2480374228,"size":340,"mtime":1714361602,"comp_size":214,"comp_method":8,"encryption_method":0}]

__MACOSX/ 是一個在 macOS 系統中創建的 zip 檔案可能會包含的特殊目錄。當你在 macOS 中使用內建的壓縮工具來創建 zip 檔案時,系統會自動在 zip 檔案中創建一個名為 __MACOSX/ 的目錄。

解決方法

判斷開頭為 __MACOSX/._ 的檔案,不進行上傳

1
2
3
4
5
6
7
8
for ($i = 0; $i < $zip->numFiles; $i++) {
$stat = $zip->statIndex($i);
if (strpos($entry, '__MACOSX/') === 0) {
// This is a __MACOSX/ entry, skip it
continue;
}
// 上傳檔案
}

以下幾種方法可以將 PDF 顯示在 網頁中

embed

1
2
<embed src="http://example.com/the.pdf" width="500" height="375" 
type="application/pdf">
  • 好處:鑲嵌簡單
  • 壞處:在手機瀏覽器中顯示會有問題,如果可以使用另開視窗顯示也是一種方法
閱讀全文 »

介紹

  • Portrait of Pirates One Piece POP WA-MAXIMUM 和之國大和
  • 購入價格: 5,680
  • 購入地點: 轉蛋概念館(預購)
  • 全新台版
POP MAX 和之國大和
閱讀全文 »

緣由

由於主機內部的Golang程式,會因為不明原因Crash 服務被 kill掉

造成API連線不到,需要監聽來第一時間告知發生問題,緊急處理

可以用來監聽 API 是否是正常的 200 回應

或是 主機的服務是否正常

如果不正常可以透過Line Notify 通知之類的

閱讀全文 »

實作遇到的bug

當時所有的網路上都是提供這個方法,但跑測試都是取得 Http code 422,驗證失敗的錯誤訊息

反覆測試移除掉 'mimes:png,jpg,jpeg' 就可以通過,但印出來的file檔案內容有點奇怪

閱讀全文 »

起初聽到一位學姊說:他同事耳根子很硬不聽勸告,由於SQL的WhereIn條件只能下1000個,所以他同事就改成10個query,但執行時間要30幾秒,一樣可以解決,但其他人都覺得應該要用JOIN方式才是比較好

我常使用的是MySQL,也時常使用子查詢用WhereIn 來做條件搜尋,都沒有遇過這種只能查1000個條件的問題產生,就好奇是不是不同的SQL會有不同的設定或限制。

閱讀全文 »