2011-09-19 71 views
2

我有一些比較大的文件(1MB-32MB),我需要從一個桌面應用程序將它們發送到PHP編寫的腳本(使用稱爲笨一個PHP框架的幫助)。由於文件是相當大的,我考慮到這些文件分割成小塊/包,編碼他們每個人Base64和一個通過JSON格式的消息給他們一個。從客戶端發送大文件到服務器,我的邏輯正確嗎?

我有關於如何將它們發送到服務器的想法,但我想先問問你什麼,你想想,如果你認爲這還好吧,或者如果它是有缺陷的。

這。由於英語不是我的母語,我更願意將它作爲兩個主題(客戶端和服務器)之間的對話。我以爲你會理解更好一點我想要做的事:

消息#1:

客戶:「嗨服務器,我需要一個-X-字節長送你。文件中的文件,我會送你將有-file_cheksum-的校驗「

服務器:」好,我已經準備好接受它的長度拆分它-N-小包,每個。 -Y-字節,並通過一個在這裏一個給他們,我會記住,如果你的消息,你提到你正在發送包如何與他們無關組裝文件具有ID -FILE_ID-「

消息#2:

客戶:」這是-N-的第一分組,爲了組裝一個-FILE_ID文件名爲該分組所需的 - , 和這裏的第一個數據包的校驗和,所以你可以看看這個包在良好的狀態已經到來「

服務器:」謝謝你的客戶,我只是記住了他在一個臨時文件夾。繼續下去 「

...

消息#N + 1:

客戶:」。這裏是-N-的-N-包,這是最後一個數據包,它的組裝一臺名爲-FILE_ID-, 文件要求和這裏的最後一個數據包的校驗,所以你可以檢查數據包中的「

服務器:」好身材已經來臨感謝您的客戶端,我只是組裝TOG對所有數據包進行封裝並驗證校驗和; 生成的文件是確定的。好工作。」

每個消息將通過HTTP POST由服務器發送,將與JSON被格式化,以及含有該文件的一部分的每個分組將以Base64編碼,然後進行解碼。下面是從客戶端發送到服務器的消息的示例:

{ 
    "request": "set-packet", 
    "id": " [ file ID ] ", 
    "packet": 
    { 
     "file": " [ here goes the packet in Base64 ] ", 
     "checksum": " [ here goes the checksum ] " 
    } 
} 

如果一切都還好吧,服務器會迴應:

{ 
    "status": "ok", 
    "message": "packet memorized" 
} 

如果有一個問題,在服務器,而不是將例如響應:

{ 
    "status": "error", 
    "message": "Checksum doesn't match, try again" 
} 

您對這種邏輯有什麼看法?它是正確的還是有缺陷的,你會對它做出改進嗎?

謝謝

+0

ftp有什麼問題? – 2011-09-19 06:36:57

+0

問題是服務器可能安裝在託管網站上。不幸的是,FTP訪問可能並不總是一個選項。 – Cesco

+1

Multipart POST會有幫助嗎? – Kris

回答

1

我相信你所建議的解決方案是這樣的應用層上過於大材小用。你正在做的傳輸協議層檢查(包校驗)(HTTP)。是的,它可以工作,但是它毫無疑問地將工作翻倍,數據包校驗和已經發生在TCP/IP級別(早在HTTP抽象級別之前)。

我也會參考Dagon的建議,使用用於文件傳輸的協議:FTP(或SSH)。任何共享主機都應該有ftp或ssh(否則,你如何首先獲得服務器上的任何文件:P)。檢出ftp http://be.php.net/manual/en/book.ftp.php和ssh http://be.php.net/manual/en/book.ssh2.php擴展名的php。

乾杯

0

只需使用簡單的HTTP POST uploads並確保的upload_max_filesize(php.ini中)至少爲32M。不要指望在這裏重新發明輪子。

還有一個CI class,你可能會覺得有用。

相關問題