標籤:
1.前端代碼
使用超連結到Struts的Action或Servlet
<a target="_blank" href="ftpFileAction!downloadFile.action?transUrl=ftp://10.0.2.1/tazi/a.xml">請點擊下載</a>
2.後台代碼 Action或Servlet
String s1=transUrl; // transUrl是前台接受的參數s1=s1.substring(6);s1=s1.substring(s1.indexOf("/"));String fn=s1.substring(s1.lastIndexOf("/")+1);String filepath=s1.substring(0,s1.lastIndexOf("/"));response.setCharacterEncoding("gbk");response.setContentType("application/octet-stream"); response.addHeader("Content-Disposition", "attachment;filename=\"" + fn+ "\"");//response檔案頭中定義的filename包含的中文必須是原始的ISO-8859-1編碼。String filename=new String(fn.getBytes("ISO-8859-1"),"gbk");//程式中要使用的檔案名稱,必須轉換為gbk編碼boolean suc=false;suc=downFileStream("10.0.2.1", 21,"myUser","myPwd", filepath, filename, os);//downFileStream是一個下載ftp檔案到檔案流的方法if(!suc){ response.reset(); response.setCharacterEncoding("gbk"); PrintWriter writer=new PrintWriter(os); writer.write("指定的檔案不存在!"); writer.close();}else{ os.close();};
3.ftp檔案下載處理
注意這裡引入的包是
org.apache.commons.net.ftp.*
(1).下載到本地
import org.apache.commons.net.ftp.FTP;import org.apache.commons.net.ftp.FTPClient;import org.apache.commons.net.ftp.FTPFile;import org.apache.commons.net.ftp.FTPReply;public static boolean downFile(String url, // FTP伺服器hostname int port,// FTP伺服器連接埠 String username, // FTP登入帳號 String password, // FTP登入密碼 String remotePath,// FTP伺服器上的相對路徑 String fileName,// 要下載的檔案名稱 String localPath// 下載後儲存到本地的路徑) { boolean success = false; FTPClient ftp = new FTPClient(); try { int reply; ftp.connect(url, port); // 如果採用預設連接埠,可以使用ftp.connect(url)的方式直接連接FTP伺服器 ftp.login(username, password);// 登入 reply = ftp.getReplyCode(); if (!FTPReply.isPositiveCompletion(reply)) { ftp.disconnect(); return success; } ftp.changeWorkingDirectory(remotePath);// 轉移到FTP伺服器目錄 FTPFile[] fs = ftp.listFiles(); boolean ftpFileExist=false; for (FTPFile ff : fs) { if (ff.getName().equals(fileName)) { ftpFileExist=true; File dir = new File(localPath); if(!dir.exists()){ dir.mkdirs(); } File localFile = new File(localPath + File.separator + ff.getName()); OutputStream is = new FileOutputStream(localFile,true); ftp.setBufferSize(1024); if(ftp.setFileType(FTP.BINARY_FILE_TYPE)){ ftp.retrieveFile(ff.getName(), is); is.close(); } } } ftp.logout(); if(ftpFileExist){ success = true; } } catch (IOException e) { e.printStackTrace(); } finally { if (ftp.isConnected()) { try { ftp.disconnect(); } catch (IOException ioe) { } } } return success;}
(2).下載到檔案輸出資料流 OutputStream
public static boolean downFileStream(String url, // FTP伺服器hostname int port,// FTP伺服器連接埠 String username, // FTP登入帳號 String password, // FTP登入密碼 String remotePath,// FTP伺服器上的相對路徑 String fileName,// 要下載的檔案名稱 OutputStream os) { boolean success = false; FTPClient ftp = new FTPClient(); try { int reply; ftp.connect(url, port); // 如果採用預設連接埠,可以使用ftp.connect(url)的方式直接連接FTP伺服器 ftp.login(username, password);// 登入 reply = ftp.getReplyCode(); if (!FTPReply.isPositiveCompletion(reply)) { ftp.disconnect(); return false; } ftp.changeWorkingDirectory(remotePath);// 轉移到FTP伺服器目錄 FTPFile[] fs = ftp.listFiles(); boolean ftpFileExist=false; for (FTPFile ff : fs) { String ffName=new String(ff.getName().getBytes("ISO-8859-1"),"gbk"); if (ffName.equals(fileName)) { ftpFileExist=true; ftp.setBufferSize(1024); if(ftp.setFileType(FTP.BINARY_FILE_TYPE)){ ftp.retrieveFile(ff.getName(), os); } } } ftp.logout(); if(ftpFileExist){ success = true; } } catch (IOException e) { e.printStackTrace(); } finally { if (ftp.isConnected()) { try { ftp.disconnect(); } catch (IOException ioe) { } } } return success;}
java/struts/Servlet檔案下載與ftp檔案下載