/ PHP

[Plupload note.] 重新命名的錯誤

官方的 example 中,有一個範例的 upload.php,對於重複檔案的檢查有個錯誤。Plupload 使用的上傳方式是 multipart,所以他會將檔案依照 chunk 的大小分割成許多的 chunks,然後依序的將這些被分割出來的部份上傳到遠端主機上。

	// Make sure the fileName is unique but only if chunking is disabled
	if ($chunks < 2 && file_exists($targetDir . DIRECTORY_SEPARATOR . $fileName)) {
	    $ext = strrpos($fileName, '.');
	    $fileName_a = substr($fileName, 0, $ext);
	    $fileName_b = substr($fileName, $ext);
	    $count = 1;
	    while (file_exists($targetDir . DIRECTORY_SEPARATOR . $fileName_a . '_' . $count . $fileName_b))
	    $count++;
	    $fileName = $fileName_a . '_' . $count . $fileName_b;
	}

我們藉由紀錄 chunkchunks 大概會是這個樣子:

chunk: 0, chunks: 1
chunk: 1, chunks: 2
chunk: 2, chunks: 3
chunk: 3, chunks: 4
chunk: 4, chunks: 5

假設檔案被切割成五個部份,那麼他就會去呼叫後端的上傳位址五次。那麼,上述那個程式就有點錯誤。上述官方的範例是,當 chunks 是倒數第二個的時候,才去檢查檔案名稱是否有重複的問題。但是這樣其實不太正確。

正確避開方式要由前端進行,請參考 [Plupload Note.] 微妙的錯誤

應該是第一次上傳檔案就必須檢查是否有重複檔名,然後將之避開。

	// Make sure the fileName is unique but only if chunking is disabled
	if ($chunk == 0 && file_exists($targetDir . DIRECTORY_SEPARATOR . $fileName)) {
	    $ext = strrpos($fileName, '.');
	    $fileName_a = substr($fileName, 0, $ext);
	    $fileName_b = substr($fileName, $ext);
	    $count = 1;
	    while (file_exists($targetDir . DIRECTORY_SEPARATOR . $fileName_a . '_' . $count . $fileName_b))
	    $count++;
	    $fileName = $fileName_a . '_' . $count . $fileName_b;
	}

這樣才對,不然在多人使用的上傳介面時,會發生檔案互相覆蓋的錯誤。