FTP上传和下载文件

mac2026-08-17  1

使用FTP之前最好先在服务器上安装一个serv-u软件,用它设置ftp服务表叫方便。 实现ftp文件下载

package cn.java.store.test; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; 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 class FtpApche { private static FTPClient ftpClient = new FTPClient(); private static String encoding = System.getProperty("file.encoding"); /** * Description: 从FTP服务器下载文件 * * @Version1.0 * * @param url FTP服务器hostname * @param port FTP服务器端口 * @param username FTP登录账号 * @param password FTP登录密码 * @param remotePath FTP服务器上的相对路径 * @param fileName 要下载的文件名 * @param localPath 下载后保存到本地的路径 * @return */ public static boolean downFile(String url, int port, String username, String password, String remotePath, String fileName, String localPath) { boolean result = false; try { int reply; ftpClient.setControlEncoding(encoding); /* * 为了上传和下载中文文件,有些地方建议使用以下两句代替 new * String(remotePath.getBytes(encoding),"iso-8859-1")转码。 经过测试,通不过。 */ // FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT); // conf.setServerLanguageCode("zh"); ftpClient.connect(url, port); // 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器 ftpClient.login(username, password);// 登录 // 设置文件传输类型为二进制 ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); // 获取ftp登录应答代码 reply = ftpClient.getReplyCode(); // 验证是否登陆成功 if (!FTPReply.isPositiveCompletion(reply)) { ftpClient.disconnect(); System.err.println("FTP server refused connection."); return result; } // 转移到FTP服务器目录至指定的目录下 ftpClient.changeWorkingDirectory(new String(remotePath.getBytes(encoding), "iso-8859-1")); // 获取文件列表 FTPFile[] fs = ftpClient.listFiles(); for (FTPFile ff : fs) { if (ff.getName().equals(fileName)) { File localFile = new File(localPath + "/" + ff.getName()); OutputStream is = new FileOutputStream(localFile); ftpClient.retrieveFile(ff.getName(), is); is.close(); } } ftpClient.logout(); result = true; } catch (IOException e) { e.printStackTrace(); } finally { if (ftpClient.isConnected()) { try { ftpClient.disconnect(); } catch (IOException ioe) { } } } return result; } /** * 将FTP服务器上文件下载到本地 * */ public void testDownFile() { try { boolean flag = downFile("10.0.0.102", 21, "admin", "123456", "/", "ip.txt", "E:/"); System.out.println(flag); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { FtpApche fa = new FtpApche(); fa.testDownFile(); } }

单个文件下载

//单个文件下载 public void Ftpdownload(String reaName,String fileName,String remote,HttpServletResponse response,HttpServletRequest request) throws IOException { // 开启输出流弹出文件保存路径选择窗口 response.setContentType("application/octet-stream"); response.setContentType("application/OCTET-STREAM;charset=UTF-8"); //解决下载文件中文名称乱码的问题 String agent = request.getHeader("USER-AGENT"); if(agent != null && agent.toLowerCase().indexOf("firefox") > 0) { reaName = "=?UTF-8?B?" + (new String(Base64.encodeBase64(reaName.getBytes("UTF-8")))) + "?="; } else { reaName = java.net.URLEncoder.encode(reaName, "UTF-8"); } response.setHeader("Content-Disposition", "attachment;filename=" +reaName); OutputStream out = response.getOutputStream(); // 转移到FTP服务器目录至指定的目录下 ftpClient.changeWorkingDirectory(new String(remote.getBytes(LOCAL_CHARSET), SERVER_CHARSET)); //下载FTP服务器指定文件 ftpClient.retrieveFile(new String(fileName.getBytes(LOCAL_CHARSET), SERVER_CHARSET), out); out.close(); }

所有文件打包下载

//打包下载 public void download(Map<String,String> map,String isbn,HttpServletResponse response){ // 开启输出流弹出文件保存路径选择窗口 response.setContentType("application/octet-stream"); response.setContentType("application/OCTET-STREAM;charset=UTF-8"); //解决下载文件中文名称乱码的问题 try { SimpleDateFormat simpleDateFormat; simpleDateFormat = new SimpleDateFormat("yyyyMMdd"); Date date = new Date(); String folderName=isbn+"-"+simpleDateFormat.format(date); response.setHeader("Content-Disposition", "attachment;filename=" +URLEncoder.encode(folderName+".zip", "UTF-8")); } catch (UnsupportedEncodingException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } //设置缓存大小 byte[] buffer = new byte[1024]; OutputStream out; try { out = response.getOutputStream(); //开启压缩流 ZipOutputStream zipout = new ZipOutputStream(out); int len; FTPFile[] listFiles=ftpClient.listFiles(); Set<String> set = map.keySet(); List<InputStream> list = new ArrayList<InputStream>(); for (String key : set) { // 转移到FTP服务器目录至指定的目录下 ftpClient.changeWorkingDirectory(new String(map.get(key) .getBytes(LOCAL_CHARSET), SERVER_CHARSET)); String string = new String(key.getBytes(LOCAL_CHARSET),SERVER_CHARSET); //从FTP服务器下载文件到文件流 InputStream retrieveFileStream = ftpClient .retrieveFileStream(string); //标记为压缩包中内的一个新文件 zipout.putNextEntry(new ZipEntry(key)); //写入输出流 while ((len = retrieveFileStream.read(buffer)) > 0) { zipout.write(buffer, 0, len); } //关闭下载流 retrieveFileStream.close(); //FTP内置方法,必须调用才能下载下一个文件流 ftpClient.completePendingCommand(); } //关闭压缩流 zipout.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }

FTP的文件上传

import java.io.File; import java.io.FileInputStream; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPReply; public class FTPTest_05 { private FTPClient ftp; /** * * @param path 上传到ftp服务器哪个路径下 * @param addr 地址 * @param port 端口号 * @param username 用户名 * @param password 密码 * @return * @throws Exception */ private boolean connect(String path,String addr,int port,String username,String password) throws Exception { boolean result = false; ftp = new FTPClient(); int reply; ftp.connect(addr,port); ftp.login(username,password); ftp.setFileType(FTPClient.BINARY_FILE_TYPE); reply = ftp.getReplyCode(); if (!FTPReply.isPositiveCompletion(reply)) { ftp.disconnect(); return result; } ftp.changeWorkingDirectory(path); result = true; return result; } /** * * @param file 上传的文件或文件夹 * @throws Exception */ private void upload(File file) throws Exception{ if(file.isDirectory()){ ftp.makeDirectory(file.getName()); ftp.changeWorkingDirectory(file.getName()); String[] files = file.list(); for (int i = 0;i < files.length;i++) { File file1 = new File(file.getPath()+"\\"+files[i] ); if(file1.isDirectory()){ upload(file1); ftp.changeToParentDirectory(); }else{ File file2 = new File(file.getPath()+"\\"+files[i]); FileInputStream input = new FileInputStream(file2); ftp.storeFile(file2.getName(), input); input.close(); } } }else{ File file2 = new File(file.getPath()); FileInputStream input = new FileInputStream(file2); ftp.storeFile(file2.getName(), input); input.close(); } } public static void main(String[] args) throws Exception{ FTPTest_05 t = new FTPTest_05(); boolean connFlag = t.connect("/", "10.0.0.105", 21, "ls", "123456"); System.out.println("connFlag : " + connFlag); File file = new File("D:\\test02");//本机被传文件的地址 System.out.println("file : " + file); t.upload(file); System.out.println("upload : " + "ok"); } }
最新回复(0)