官方的 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;
}
我們藉由紀錄 chunk
與 chunks
大概會是這個樣子:
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;
}
這樣才對,不然在多人使用的上傳介面時,會發生檔案互相覆蓋的錯誤。