初次接觸FTPclient
參與了一個基於Spring MVC框架的網站開發,其他帶過,其中有個模組涉及到檔案的上傳功能,使用了js 的uploadfiy外掛,上傳時還會有百分比的進度條,後臺使用FileOutputStream的write方法,在此碰到了個問題,上傳檔案大小總有限制,最開始僅能上傳100M以下的檔案。
網上搜索出很多建議:改spring的配置檔案
<property name="maxUploadSize">
<value>999999999999</value>
</property>
改uploadfiy的引數sizeLimit (上傳檔案的大小限制)。
這兩個都更改了後,效果還是不大,有時候是上傳的進度條到百分之幾時就會中斷,然後報IO error錯誤,有時候是進度條跑完後,後臺程式報異常。
還有建議是改網站伺服器的配置,改tomcat配置。(不知道有用沒)
感覺上傳的controller應該要換一種方式試試,於是看到了FTPCLient,貌似這個上傳檔案比HTTP協議穩定,而且還支援斷點續傳(不會用),都不知怎麼開始用,感覺莫名其妙,於是各種找demo,終於找到一個能用的:
(程式碼來源於網路)<span style="white-space:pre"> </span>FTPClient ftpClient = new FTPClient(); FileInputStream fis = null; try { ftpClient.connect("192.168.14.117"); ftpClient.login("admin", "123"); File srcFile = new File("C:\\new.gif"); fis = new FileInputStream(srcFile); //設定上傳目錄 ftpClient.changeWorkingDirectory("/admin/pic"); ftpClient.setBufferSize(1024); ftpClient.setControlEncoding("GBK"); //設定檔案型別(二進位制) ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); ftpClient.storeFile("3.gif", fis); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException("FTP客戶端出錯!", e); } finally { IOUtils.closeQuietly(fis); try { ftpClient.disconnect(); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException("關閉FTP連線發生異常!", e); } }
當ftpClient.storeFile 方法返回ture時,就說明上傳成功了,此時注意要新增jar包,我用的是commons-net-3.3.jar,專案匯入此包後,還要將這個包複製一份到tomcat的lib目錄下,否則會找不到這個類,做完這個後,卻還是返回了false,又在網上看到
呼叫FTPClient.enterLocalPassiveMode();這個方法的意思就是每次資料連線之前,ftp
client告訴ftp server開通一個埠來傳輸資料。為什麼要這樣做呢,因為ftp server可能每次開啟不同的埠來傳輸資料,但是在linux上,由於安全限制,可能某些埠沒有開啟,所以就出現阻塞。
於是我加入了這個方法,果然就ok了,改動之後,上傳的檔案大小能到四五百兆。
總結:方法是找到了,但是還是知其然不知其所以然,慚愧啊,都不知道原因到底在哪,唉,再一個就是,如果上傳再大些的檔案,uploadfiy的進度條到不了5%就斷掉了,然後還是報IO error,覺得還是這個js外掛沒弄好。第一次寫哈,請多包涵嘿嘿,記錄下這個過程以便複習,這其中還有好多沒弄明白的緣由,希望大神們多多賜教。