FTP傳輸一定要注意使用二進制模式!

今天一個問題困擾了我一下午,剛剛纔解決。我要上傳一個PHP程序,其中用了sqlite數據庫,沒想到上傳完以後無論如何也不能用,總是數據庫查詢失敗。我登錄上SSH,把幾乎每個php都調試了一遍,還是沒法解決。最終請來T.G.大牛幫助,才發現服務器上的sqlite數據庫與本地的MD5值不一樣。於是我又用Filezilla吧數據庫上傳了一遍,沒想到的是,MD5值仍然和本地的文件不同。這時我突然想起了以前用gcc在Windows下強制輸出\n而不是\r\n的窘境,於是把Filezilla的上傳模式從“自動選擇”改成了“二進制模式”,再次上傳,問題終於解決了。

FTP傳輸的兩種模式

1.ASCII傳輸方式:

假定用戶正在拷貝的文件包含的簡單ASCII碼文本,如果在遠程機器上運行的不是UNIX,當文件傳輸時ftp通常會自動地調整文件的內容以便於把文件解釋成另外那臺計算機存儲文本文件的格式。

但是常常有這樣的情況,用戶正在傳輸的文件包含的不是文本文件,它們可能是程序,數據庫,字處理文件或者壓縮文件(儘管字處理文件包含的大部分是文本,其中也包含有指示頁尺寸,字庫等信息的非打印字符)。在拷貝任何非文本文件之前,用binary 命令告訴ftp逐字拷貝,不要對這些文件進行處理,這也是下面要講的二進制傳輸。

2.二進制傳輸模式:

在二進制傳輸中,保存文件的位序,以便原始和拷貝的是逐位一一對應的。即使目的地機器上包含位序列的文件是沒意義的。例如,macintosh以二進制方式傳送可執行文件到Windows系統,在對方系統上,此文件不能執行。

如果你在ASCII方式下傳輸二進制文件,即使不需要也仍會轉譯。這會使傳輸稍微變慢 ,也會損壞數據,使文件變得不能用。(在大多數計算機上,ASCII方式一般假設每一字符的第一有效位無意義,因爲ASCII字符組合不使用它。如果你傳輸二進制文件,所有的位都是重要的。)如果你知道這兩臺機器是同樣的,則二進制方式對文本文件和數據文件都是有效的。

相關日誌