2012-03-29 91 views
3

我在客戶端上傳的遠程機器上有一個目錄(通過不同的工具和協議,從WebDav到FTP)文件。我也有一個PHP腳本返回目錄結構。現在,問題是,如果客戶端上傳大文件,並且在上傳時間內發出請求,那麼PHP腳本即使沒有完全上傳,也會返回該文件。有沒有辦法檢查一個文件是否使用PHP完全上傳?有沒有辦法檢查文件是否使用PHP完全上傳?

+3

簡而言之,答案是否定的。漫長的回答是不好的。 – satoshi 2012-03-29 15:56:29

回答

6

設置您的遠程服務器將上傳的文件移動到另一個目錄,並且只查詢目錄文件被移動到文件。

據我所知,是沒有辦法(至少橫機)說,如果一個文件仍然被上載,沒有做這樣的事情:

  1. 查詢該文件的長度
  2. 等待幾秒鐘
  3. 查詢該文件的長度
  4. 如果是一樣的,它可能完成
+0

+1表示邏輯,但即使這是有道理的,檢查文件大小的最佳時間段是什麼。如果上傳器的連接問題可能會在文件上傳過程中導致嚴重延遲,這意味着該文件可能具有相同的大小5,6,10秒或更長時間。如果文件較大,上傳速度較慢,則不能很好地解決問題,因爲您無法等待幾個小時來查看是否完成。 **沒有辦法**可能是最好的答案。 – Wh1T3h4Ck5 2012-03-29 16:10:57

+0

的確,這就是爲什麼我提供了一個可行的解決方案,而不是檢查文件大小。至少OP可以根據他想做的事情做出決定。 – 2012-03-29 16:12:13

+0

我不會依賴文件大小檢查,因爲元數據可能被緩存在操作系統中,而臨時網絡失速會欺騙你的檢查。網絡連接可能會停頓很多秒,在某些情況下甚至會持續幾分鐘。 – 2012-03-29 23:41:39

0

我認爲,某些操作系統在下載文件時會包含一個「.part」文件,因此可能會檢查是否存在這樣的文件。否則,我同意Brian的回答。如果您在同一個系統上使用該腳本,那麼使用move_uploaded_file()的返回值(如果該腳本正在被PHP腳本上傳)足夠簡單,但它確實成爲從遠程目錄拉取的一個挑戰,該目錄可以添加到不同的協議。

1

大多數UNIX/Linux/BSD-like操作系統有一個叫做lsof(lsof代表「列表打開文件」)的命令,它輸出系統中所有當前打開文件的列表。您可以運行該命令來查看是否有任何進程仍在使用該文件。如果沒有,您的上傳已完成。在這個例子中,AWK是用來過濾所以只有文件將顯示,與寫打開或讀/寫文件句柄:

if (shell_exec("lsof | awk '\$4 ~ /.*[uw]/' | grep " . $uploaded_file_name) == '') { 
    /* No file handles open for this file, so upload is finished. */ 
} 

我不是很熟悉Windows服務器,但這個線程可以幫助你在Windows機器上做同樣的事情(如果這是你所擁有的):How can I determine whether a specific file is open in Windows?

+0

對不起,忘了提及,我在Linux上,並且永遠是(不是可移植性的問題)。這聽起來很棒!謝謝!明天會嘗試。 – 2012-03-29 23:44:18

+0

這個問題是,它計數任何訪問文件,上傳,下載等我想它可以被更新爲僅用於上傳,但它取決於如何訪問該文件(webdav,ftp,ssh等) – 2012-04-03 11:46:46

+0

嗯,是。但是,您可以使用awk僅顯示使用寫入或讀取/寫入文件處理程序打開的文件。這樣,閱讀不會打擾你。編輯答案... – 2012-04-08 21:06:10

相關問題