FTP报550异常-Create directory operation failed
幫同事查看ftp上傳文件失敗的問題,發現了以上報錯。
排查文件路徑是否有授權
??查看了linux中的文件目錄,查看是否為權限問題(如有問題,可執行:chmod -R 777 文件夾名)。
??使用debug查看sendCommand方法返回的replycode為250,也表明文件夾創建成功。
查看是否是切換文件夾路徑時報錯
??切換文件夾路徑方法名為:changeWorkingDirectory。通過idea debug模式的evaluate查看ftp的當前路徑:printWorkingDirectory,發現result為null!!!ftp是根據當前路徑一層層去切換路徑的,初始路徑為null肯定會導致失敗。
??初始化ftp時,是給ftp初始化了路徑的,為什么此時當前路徑為null呢?后查看發現同事是先從ftp獲取了文件(調用了方法:retrieveFileStream),然后再執行文件上傳。在從ftp上傳文件夾前,printWorkingDirectory打印的目錄是有值的,執行完retrieveFileStream方法后,再調用printWorkingDirectory方法,返回結果就為null了。
解決方案
??為什么會變成null,原因不清楚?,F有解決方案是,執行retrieveFileStream方法并將流關閉后,要執行completePendingCommand方法,這時,printWorkingDirectory方法又能正常返回當前文件路徑了。
public ByteArrayOutputStream downloadStream(String ftpPath, String fileName) throws IOException {if (!setReady()) {throw new RuntimeException("ftp 連接失敗");}// 切換到文件目錄下,并獲取目錄下所有文件client.changeWorkingDirectory(ftpPath);FTPFile[] ftpFiles = client.listFiles(ftpPath);// 判斷文件是否存在Boolean have = false;int size = 0;for (FTPFile ftpFile : ftpFiles) {if(StringUtil.equals(ftpFile.getName(),fileName)){// 避免編碼問題,將匹配的文件名稱賦值給 fileNamefileName = ftpFile.getName();size = (int) ftpFile.getSize();have = true;}}// 判斷文件是否存在if(!have){throw new RuntimeException("未查找到該文件");}// 建立傳輸連接,并讀取文件 InputStreamclient.enterLocalPassiveMode();InputStream in = client.retrieveFileStream(new String(fileName.getBytes(config.getLocalEncoding()), config.getRemoteEncoding()));ByteArrayOutputStream out = new ByteArrayOutputStream();byte[] b = new byte[(int) size];int len = 0;while ((len = in.read(b)) != -1) {out.write(b, 0, len);}out.flush();in.close();client.completePendingCommand();return out;}總結
以上是生活随笔為你收集整理的FTP报550异常-Create directory operation failed的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GBase 8c 权限说明
- 下一篇: 《构建之法》作业:口算出题器