我要啦免费统计

          微藍領域

          我的學習檔案館
          posts - 19, comments - 57, trackbacks - 0, articles - 57
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          java實現FTP文件上傳出現的問題

          Posted on 2007-08-23 11:33 hilor 閱讀(6737) 評論(3)  編輯  收藏 所屬分類: J2EE
          昨天用JAVA寫了一個實現FTP文件上傳功能的類(是通過sun.net.ftp包實現的,此包為SUN的私有類包,所以官方沒有提供相關API文檔),然后進行了簡單的測試。
          具體類代碼如下(此類的部分方法還未完善):
          package com.tools;
          import java.io.FileInputStream;
          import java.io.IOException;
          import sun.net.TelnetOutputStream;
          import sun.net.ftp.FtpClient;
          /**
           * @author simplelife 
           * @version 1.0
           *
           */
          public class FtpTool{
           
           private FtpClient ftp; 
           
           /**
            * 構造方法,新建一個FtpClient對象,并打開FTP服務器
            * @param host FTP服務器地址;port FTP服務端口
            *
            */
           public FtpTool(String host,int port)throws IOException{
            ftp = new FtpClient();
            ftp.openServer(host, port);
           }
           
           /**
            * 登陸方法,通過用戶名密碼登陸到指定的FTP服務器上去,并返回歡迎信息
            * @param username FTP用戶名;password 密碼
            *
            */
           public String login(String username,String password)throws IOException{
            this.ftp.login(username, password);
            return this.ftp.welcomeMsg;
           }
           
           /**
            * 此方法用來上傳文件。
            * @param pathname 本地路徑;filename 要上傳的文件名稱
            *
            */
           public void upload(String pathname,String filename)throws IOException{
              if(!this.ftp.serverIsOpen()){
               System.out.println("服務器連接不可用!");
              }
              this.ftp.binary();
              TelnetOutputStream os = null;
              FileInputStream is = null;
              try {
               //用ftp上傳后的文件名與原文件名相同,同為filename變量內容
               os = this.ftp.put(filename);
               java.io.File file_in = new java.io.File(pathname+"\\"+filename);
               if (file_in.length()==0) {
                System.out.println("上傳文件為空!");
               }
               is = new FileInputStream(file_in);
               byte[] bytes = new byte[1024];
               int c;
               while ((c = is.read(bytes)) != -1) {
                os.write(bytes, 0, c);
               }
              } finally {
               if (is != null) {
                is.close();
               }
               if (os != null) {
                os.close();
               }
              }
              System.out.println("上傳文件成功!");
              this.ftp.ascii();
           }
           
           /**
            * 此方法用來下載文件。
            * @param pathname 本地路徑;filename 要上傳的文件名稱
            *
            */
           public void download(String pathname,String filename)throws IOException{
            
           }
           
           
           public static void main(String[] args){
            try{
             FtpTool ftpt = new FtpTool("128.14.9.13",21);
             String welstr = ftpt.login("xxxx", "xxxxxxxx");
             System.out.println(welstr);
             ftpt.upload("C:", "111.txt");
            }catch(IOException ioe){
             ioe.printStackTrace();
            }
           }
          }
          在測試過程中拋出一個異常,具體信息如下:
          User at logged in.
           
          sun.net.ftp.FtpProtocolException: STOR 111.txt:425 Can't build data connection: Connection timed out.
           at sun.net.ftp.FtpClient.openDataConnection(Unknown Source)
           at sun.net.ftp.FtpClient.put(Unknown Source)
           at com.tools.FtpTool.upload(FtpTool.java:56)
           at com.tools.FtpTool.main(FtpTool.java:94)
          拋出此異常的具體表現為:在FTP服務器上已經創建了該文件,但文件大小為0。在網上搜索相關異常描述也很少,經過仔細分析發現,此問題與FTP客戶端防火墻有關。然后我關閉防火墻軟件,再進行測試,一切OK!
           
          在網上也發現另一個常見異常,我將它重現并做說明。其主要原因是很多FTP服務沒有使用默認端口,在代碼實現中,連接端口不正確所導致異常出現的。
          sun.net.ftp.FtpProtocolException: Welcome message: ??$
           at sun.net.ftp.FtpClient.openServer(Unknown Source)
           at com.tools.FtpTool.<init>(FtpTool.java:29)
           at com.tools.FtpTool.main(FtpTool.java:91)
           
          第三種異常就是由于FTP服務器端的FTP服務沒有開啟,連接被拒絕所導致的。具體異常如下:
          java.net.ConnectException: Connection refused: connect
           at java.net.PlainSocketImpl.socketConnect(Native Method)
           at java.net.PlainSocketImpl.doConnect(Unknown Source)
           at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
           at java.net.PlainSocketImpl.connect(Unknown Source)
           
           
                 最后,如果大家遇到什么新的相關問題,可以在這里留言,我們來共同解決問題、學習提高。

          評論

          # re: java實現FTP文件上傳出現的問題  回復  更多評論   

          2009-03-02 09:15 by shiqy
          我也用sun.net.ftp包實現的ftp實現上傳,但是我上傳的文件都變成空的,沒有報錯施什么回事????我可以手動的上傳沒問題,上傳的文件非空。

          # re: java實現FTP文件上傳出現的問題[未登錄]  回復  更多評論   

          2009-07-31 16:07 by sam
          sun.net.ftp.FtpProtocolException: Welcome message:
          at sun.net.ftp.FtpClient.openServer(FtpClient.java:490)
          at com.camelot.transdata.service.impl.FtpServiceImpl.connectServer(FtpServiceImpl.java:50)
          at com.camelot.transdata.controller.TransdataController.transDataFromSAP(TransdataController.java:102)
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
          at java.lang.reflect.Method.invoke(Method.java:597)
          at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:310)
          at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.jav
          182)

          # re: java實現FTP文件上傳出現的問題  回復  更多評論   

          2009-10-25 16:39 by 啊鎮
          我想請問一下,java實現ftp文件上傳的,在文件上傳完以后,要如何判斷文件上傳成功了還是失敗了?還有,如何在客戶端獲取到上傳到服務端的文件的大小的?他們之間是怎樣進行通信的?
          主站蜘蛛池模板: 股票| 万安县| 凤山市| 甘德县| 福安市| 五峰| 八宿县| 西乌| 唐山市| 华池县| 汉阴县| 玉田县| 南开区| 阆中市| 秭归县| 安平县| 榆中县| 抚远县| 扶风县| 漳平市| 定结县| 海林市| 宜昌市| 聂拉木县| 明光市| 旬阳县| 东光县| 马尔康县| 奈曼旗| 拜泉县| 临澧县| 高州市| 都安| 台南市| 乐亭县| 黄陵县| 西平县| 繁昌县| 房山区| 余庆县| 嘉荫县|