FTP上傳檔案,報錯java.net.SocketException: Software caused connection abort: recv failed

來源:互聯網
上載者:User

標籤:main   string   錯誤   div   帳號   close   and   運行   set   

FTP上傳功能,使用之前寫的代碼,一直上傳都沒有問題,今天突然報這個錯誤:

java.net.SocketException: Software caused connection abort: recv failed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:152)
at java.net.SocketInputStream.read(SocketInputStream.java:122)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:154)
at java.io.BufferedReader.read(BufferedReader.java:175)
at org.apache.commons.net.io.CRLFLineReader.readLine(CRLFLineReader.java:58)
at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:314)
at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:294)
at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:483)
at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:608)
at org.apache.commons.net.ftp.FTP.port(FTP.java:932)
at org.apache.commons.net.ftp.FTPClient._openDataConnection_(FTPClient.java:812)
at org.apache.commons.net.ftp.FTPClient._storeFile(FTPClient.java:633)
at org.apache.commons.net.ftp.FTPClient.__storeFile(FTPClient.java:624)
at org.apache.commons.net.ftp.FTPClient.storeFile(FTPClient.java:1976)
at cn.com.fp.util.ftp.FavFTPUtil.uploadFile(FavFTPUtil.java:62)
at cn.com.fp.util.ftp.FavFTPUtil.uploadFileFromProduction(FavFTPUtil.java:139)
at cn.com.fp.util.ftp.FavFTPUtil.main(FavFTPUtil.java:363)

 

因為之前遇到過,都是流的非正常關閉導致的,我關閉所有進程,MyEclipse重啟,項目重啟,仍然報這個錯誤,又重啟電腦,仍然存在;意識到必須找到原因所在,否則都是做一些無用功。

上網找了一些部落格,才發現問題根源,客戶提供的伺服器是Linux,而My Code是在Windows 10下啟動並執行,因為ftp server可能每次開啟不同的連接埠來傳輸資料,但是在linux上或者其他伺服器上面,由於安全限制,可能某些連接埠沒有開啟,所以就出現阻塞,也就是感到代碼運行特別慢、受阻的原因,如何解決呢?如下:

添加FTPClient.enterLocalPassiveMode();這行代碼,即每次資料連線之前,ftp client告訴ftp server開通一個連接埠來傳輸資料。

代碼Demo如下:

      /** * 上傳檔案(可供Action/Controller層使用) *  * @param hostname *            FTP伺服器位址 * @param port *            FTP伺服器連接埠號碼 * @param username *            FTP登入帳號 * @param password *            FTP登入密碼 * @param pathname *            FTP伺服器儲存目錄 * @param fileName *            上傳到FTP伺服器後的檔案名稱 * @param inputStream *            輸入檔案流 * @return */public static boolean uploadFile(String hostname, int port,String username, String password, String pathname, String fileName,InputStream inputStream) {boolean flag = false;FTPClient ftpClient = new FTPClient();try {// 串連FTP伺服器ftpClient.connect(hostname, port);// 登入FTP伺服器ftpClient.login(username, password);ftpClient.setControlEncoding("UTF-8"); // 中文支援ftpClient.setConnectTimeout(5000);  // 逾時設定// 是否成功登入FTP伺服器int replyCode = ftpClient.getReplyCode();if (!FTPReply.isPositiveCompletion(replyCode)) {ftpClient.disconnect();return flag;}ftpClient.enterLocalPassiveMode();ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);ftpClient.changeWorkingDirectory(pathname);ftpClient.storeFile(fileName, inputStream);inputStream.close();ftpClient.logout();flag = true;} catch (Exception e) {e.printStackTrace();} finally {if (ftpClient.isConnected()) {try {ftpClient.disconnect();} catch (IOException e) {e.printStackTrace();}}}return flag;}

 特此記錄,希望能協助需要的人!

 

FTP上傳檔案,報錯java.net.SocketException: Software caused connection abort: recv failed

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.