天天看点

FTP上传和下载文件

使用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");
}
}