1. 程式人生 > >ftp 下載

ftp 下載

import org.apache.commons.net.ftp.FTPClient;
/**
*
*   ftp檔案下載
* @throws Exception 

*/

@GetMapping("/download")
public void download(HttpServletResponse response) throws Exception { 

String hostname="136.219.100.213";
Integer port=21;
String username="shop";
String password="000";
String remotePath="/upload/file/201710";//相對路徑   /upload/image/201710
String filename="2017032211.pdf";

FTPClient ftp= new FTPClient();

ftp.connect(hostname, port);// 連線FTP伺服器   如果採用預設埠,可以使用ftp.connect(url)的方式直接連線FTP伺服器
ftp.login(username, password);// 登入ftp
ftp.setControlEncoding("UTF-8"); // 設定字元編碼
ftp.setFileType(FTPClient.BINARY_FILE_TYPE); // 設定檔案傳輸格式
ftp.enterLocalPassiveMode();//防止埠沒有開啟
int reply = ftp.getReplyCode();// 以2開頭的都表示登陸成功
if (FTPReply.isPositiveCompletion(reply)) {
// 轉到指定下載目錄
if (!ftp.changeWorkingDirectory(remotePath)) {
String[] paths = StringUtils.split(remotePath, "/");
String p = "/";
ftp.changeWorkingDirectory(p);
for (String s : paths) {
p += s + "/";
if (!ftp.changeWorkingDirectory(p)) {
ftp.makeDirectory(s);
ftp.changeWorkingDirectory(p);
}
}
}
FTPFile[] listFiles = ftp.listFiles();//列出所有的檔案
for (FTPFile ftpFile: listFiles ) {
if (ftpFile.getName().equals(filename)) {
if (ftpFile.isFile()) {

//根據檔名下載FTP伺服器上的檔案  

//第一種觸發瀏覽器下載
InputStream ins=ftp.retrieveFileStream(ftpFile.getName());  
                ByteArrayOutputStream byteOut = new ByteArrayOutputStream();  
        byte[] buf = new byte[1024];  
        int bufsize = 0;  
        while ((bufsize = ins.read(buf, 0, buf.length)) != -1) {  
            byteOut.write(buf, 0, bufsize);  
        }  
        byte[] buffer = byteOut.toByteArray();  
        byteOut.close();  
        ins.close();  

        String fileSuffixName=   filename.substring(filename.lastIndexOf(".")+1);
       
response.reset(); //清除快取
        response.setContentType("application/" +fileSuffixName + ";" +"charset = UTF-8"); //設定字符集和檔案字尾名
        response.setHeader("Content-Disposition","attachment; filename=" +filename); // 設定檔名稱
       
        OutputStream toClient = new BufferedOutputStream(response.getOutputStream());  
        toClient.write(buffer);  
        toClient.flush();  
        toClient.close();  

//第二種下載到指定目錄
        String localPath="D:"+File.separator+"program_file"+File.separator+"FTP_file";//"D:"+File.separator+"program_file"+File.separator+"FTP_file";
        File lFile = new File(localPath);
lFile.mkdir(); // 如果檔案所在的資料夾不存在就建立
FileOutputStream fos = new FileOutputStream(localPath+File.separator+filename);
ftp.retrieveFile(ftpFile.getName(), fos);
fos.flush(); // 將緩衝區中的資料全部寫出
fos.close(); // 關閉流
}
}

ftp.logout();// 退出ftp
if (ftp.isConnected()) {
ftp.disconnect();
}
} else{
ftp.disconnect();
}


}