`
Odysseus_110
  • 浏览: 120372 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

ftp 文件上传 文件损坏

    博客分类:
  • J2SE
阅读更多

 


 

这里演示的是配置好ftp服务器后,通过java程序读取硬盘文件上传(相对于通过网页控件<input type="file">获得文件上传)。首先apache上下载 common net 包,

然后参考http://www.iteye.com/topic/139300或者http://www.iteye.com/topic/173786 提供的代码:

 

具体的操作类:

 

 

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPClientConfig;
import org.apache.commons.net.ftp.FTPFile;

public class FTPUtil {
	private FTPClient ftpClient;
	public static final int BINARY_FILE_TYPE = FTP.BINARY_FILE_TYPE;
	public static final int ASCII_FILE_TYPE = FTP.ASCII_FILE_TYPE;
	
	// path should not the path from root index
	// or some FTP server would go to root as '/'.
	public void connectServer(Properties ftpConfig) throws SocketException,
			IOException {
		String server = ftpConfig.getProperty("server");
		String user = ftpConfig.getProperty("username");
		String password = ftpConfig.getProperty("password");
		int port = 21;
		String location = ftpConfig.getProperty("location");
		connectServer(server, port, user, password, location);
	}
	
	
	public void connectServer(String server, int port, String user,
			String password, String path) throws SocketException, IOException {
		ftpClient = new FTPClient();
		ftpClient.connect(server, port);
		System.out.println("Connected to " + server + ".");
		System.out.println(ftpClient.getReplyCode());
		ftpClient.login(user, password);
		// Path is the sub-path of the FTP path
		if (path.length() != 0) {
			ftpClient.changeWorkingDirectory(path);
		}
	}
	//FTP.BINARY_FILE_TYPE | FTP.ASCII_FILE_TYPE
	// Set transform type
	public void setFileType(int fileType) throws IOException {
		ftpClient.setFileType(fileType);
	}
	
	//FTP.BINARY_FILE_TYPE | FTP.ASCII_FILE_TYPE
	// Set transform type
	public void setControlEncoding(String ControlEncoding) throws IOException {
		ftpClient.setControlEncoding(ControlEncoding);
		FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);
		conf.setServerLanguageCode("zh");
		ftpClient.configure(conf); 
	}
	
	public void closeServer() throws IOException {
		if (ftpClient.isConnected()) {
			ftpClient.logout();
			ftpClient.disconnect();
		}
	}
	//=======================================================================
	//==         About directory       =====
	// The following method using relative path better.
	//=======================================================================
	
	public boolean changeDirectory(String path) throws IOException {
		return ftpClient.changeWorkingDirectory(path);
	}
	public boolean createDirectory(String pathName) throws IOException {
		return ftpClient.makeDirectory(pathName);
	}
	public boolean removeDirectory(String path) throws IOException {
		return ftpClient.removeDirectory(path);
	}
	
	// delete all subDirectory and files.
	public boolean removeDirectory(String path, boolean isAll)
			throws IOException {
		
		if (!isAll) {
			return removeDirectory(path);
		}

		FTPFile[] ftpFileArr = ftpClient.listFiles(path);
		if (ftpFileArr == null || ftpFileArr.length == 0) {
			return removeDirectory(path);
		}
		// 
		for (FTPFile ftpFile : ftpFileArr) {
			String name = ftpFile.getName();
			if (ftpFile.isDirectory()) {
System.out.println("* [sD]Delete subPath ["+path + "/" + name+"]");				
				removeDirectory(path + "/" + name, true);
			} else if (ftpFile.isFile()) {
System.out.println("* [sF]Delete file ["+path + "/" + name+"]");						
				deleteFile(path + "/" + name);
			} else if (ftpFile.isSymbolicLink()) {

			} else if (ftpFile.isUnknown()) {

			}
		}
		return ftpClient.removeDirectory(path);
	}
	
	// Check the path is exist; exist return true, else false.
	public boolean existDirectory(String path) throws IOException {
		boolean flag = false;
		FTPFile[] ftpFileArr = ftpClient.listFiles(path);
		for (FTPFile ftpFile : ftpFileArr) {
			if (ftpFile.isDirectory()
					&& ftpFile.getName().equalsIgnoreCase(path)) {
				flag = true;
				break;
			}
		}
		return flag;
	}

	//=======================================================================
	//==         About file        =====
	// Download and Upload file using
	// ftpUtil.setFileType(FtpUtil.BINARY_FILE_TYPE) better!
	//=======================================================================

	// #1. list & delete operation
	// Not contains directory
	public List<String> getFileList(String path) throws IOException {
		// listFiles return contains directory and file, it's FTPFile instance
		// listNames() contains directory, so using following to filer directory.
		//String[] fileNameArr = ftpClient.listNames(path);
		FTPFile[] ftpFiles= ftpClient.listFiles(path);
		
		List<String> retList = new ArrayList<String>();
		if (ftpFiles == null || ftpFiles.length == 0) {
			return retList;
		}
		for (FTPFile ftpFile : ftpFiles) {
			if (ftpFile.isFile()) {
				retList.add(ftpFile.getName());
			}
		}
		return retList;
	}

	public boolean deleteFile(String pathName) throws IOException {
		return ftpClient.deleteFile(pathName);
	}

	// #2. upload to ftp server
	// InputStream <------> byte[]  simple and See API

	public boolean uploadFile(String fileName, String newName)
			throws IOException {
		boolean flag = false;
		InputStream iStream = null;
		try {
			iStream = new FileInputStream(fileName);
			flag = ftpClient.storeFile(newName, iStream);
		} catch (IOException e) {
			flag = false;
			return flag;
		} finally {
			if (iStream != null) {
				iStream.close();
			}
			closeServer();
		}
		return flag;
	}

	public boolean uploadFile(String fileName) throws IOException {
		return uploadFile(fileName, fileName);
	}

	public boolean uploadFile(InputStream iStream, String newName)
			throws IOException {
		boolean flag = false;
		try {
			// can execute [OutputStream storeFileStream(String remote)]
			// Above method return's value is the local file stream.
			flag = ftpClient.storeFile(newName, iStream);
		} catch (IOException e) {
			flag = false;
			return flag;
		} finally {
			if (iStream != null) {
				iStream.close();
			}
		}
		return flag;
	}

	// #3. Down load 

	public boolean download(String remoteFileName, String localFileName)
			throws IOException {
		boolean flag = false;
		File outfile = new File(localFileName);
		OutputStream oStream = null;
		try {
			oStream = new FileOutputStream(outfile);
			flag = ftpClient.retrieveFile(remoteFileName, oStream);
		} catch (IOException e) {
			flag = false;
			return flag;
		} finally {
			oStream.close();
		}
		return flag;
	}
	
	public InputStream downFile(String sourceFileName) throws IOException {
		return ftpClient.retrieveFileStream(sourceFileName);
	}
}

 

 测试类:

 

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.Properties;

public class TestUpload {
	public static void main(String[] args) {
		try {
			Properties config = new Properties();
			config.setProperty("server", "192.168.17.48");
			config.setProperty("username", "admin");
			config.setProperty("password", "123456");
			config.setProperty("location", "");
			
			FTPUtil client = new FTPUtil();
			client.connectServer(config);
			//client.setFileType(client.ASCII_FILE_TYPE);
			client.setFileType(client.BINARY_FILE_TYPE);
			client.setControlEncoding("GBK");
			client.uploadFile("D:\\video_1080p\\1080P\\我们Taxi3_WMVHD_Extract.wmv", "Taxi2_WMVHD_Extract.wmv");
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

 开始时候没有设定FileType,上传的文件老是略微大于本地文件的大小,而且上传后的文件后的文件无法打开。

 

使用setFileType 设置成BINARY 

 

public static final int BINARY_FILE_TYPE = FTP.BINARY_FILE_TYPE;
public static final int ASCII_FILE_TYPE = FTP.ASCII_FILE_TYPE;
client.setFileType(client.BINARY_FILE_TYPE);

 

 

zjumty 同学在他的帖子里对这个问题做了很好的解释:

写道

 

传输binary文件, 由于FTPClient默认使用ASCII作为传输模式, 所有不能传输二进制文件. 通过
ftp.setFileType(FTP.BINARY_FILE_TYPE)个可以解决这个问题, 但是要在login以后执行. 因为这个方法要向服务器发送"TYPE I"命令.
开始的时候用的是setFileTransferMode, 不过不好使. 它会执行 MODE I命令, 服务器不接受.

 

该问题解决。

参考:

http://www.iteye.com/topic/139300

http://www.iteye.com/topic/173786

分享到:
评论

相关推荐

    FTP上传文件,缩减版...

    在这个场景中,"FTP上传文件,缩减版..."的标题可能指的是一个简化版的FTP文件上传功能的实现,可能是为了教学或者快速实现基本的文件上传需求。 描述中提到"想写个借口,自己菜鸟,各位帮我看看,谢谢了",这表明...

    FTP图片上传

    10. **FTPUpdata**:这个文件可能是FTP上传的示例程序或教程,包含了解决问题的具体步骤和代码片段。它对于初学者来说是个很好的学习资源,能帮助他们理解FTP图片上传的整个流程。 总之,FTP图片上传涉及多个环节,...

    萤石云摄像头自动截图以及FTP上传

    FTP上传,全称为文件传输协议,是一种用于在网络上进行文件传输的标准协议。在此系统中,FTP被用来将萤石云摄像头自动截图的图片传送到远程FTP服务器。通过设置FTP服务器的地址、用户名、密码等信息,用户可以确保...

    centos 6.5下安装文件上传下载服务

    如果文件为二进制文件,则需要执行:rz -be ExampleFile.txt,以避免文件损坏。 最后,用户可以使用sz命令进行文件下载,例如:sz ExampleFile.txt,这将下载文件ExampleFile.txt到本地计算机上。 需要注意的是,...

    C#文件上传与下载的源代码

    在C#中,可以使用`System.Net.FtpWebRequest`类来创建FTP请求,进行文件上传和下载。 5. **HTTP/HTTPS协议** 如果涉及Web应用的文件上传下载,可能需要用到HTTP或HTTPS协议。C#提供了`System.Net.WebClient`类,这...

    空间FTP二进制上传方法

    FTP(File Transfer Protocol)是一种广泛使用的网络协议,用于在互联网上进行文件的上传和下载。在网站建设和维护中,FTP工具扮演着至关重要的角色。在某些情况下,如上传包含图片、音频、视频或编译后的程序文件时...

    智能ftp扩展工具上传工具客户端+服务端

    这个FTP扩展工具通过集成这些组件,提供了一套完整的文件上传和下载解决方案,适合需要频繁进行大文件传输或者需要高级管理功能的用户。其智能扩展特性可能包括自动重试、断点续传、文件完整性校验等功能,确保了...

    EXt3 的文件上传

    3. **网络传输协议**:文件上传通常涉及HTTP或FTP协议,理解这些协议的工作流程,以及如何在上传过程中处理断点续传、错误重试等问题。 4. **JavaScript编程**:掌握ExtJS库的基本用法,包括组件模型、事件驱动和...

    ftp传输文件模式详解

    FTP(File Transfer Protocol)是一种广泛使用的网络协议,用于在互联网上进行文件的上传和下载。在FTP传输过程中,有两种主要的文件传输模式:ASCII(文本)模式和二进制(Binary)模式,这两种模式有着不同的特性...

    ftp上传客户单

    3. **文件上传**:在FTP客户端中,用户可以选择本地文件或目录,然后将其上传到FTP服务器。这一步骤可能涉及到文件的多线程传输,以提高速度,以及断点续传功能,以便在网络中断后能继续未完成的上传。 4. **打包...

    传输文件实例(boost)

    此外,为了防止数据丢失或损坏,可以使用校验和或哈希算法来验证接收到的数据完整性。 总的来说,"传输文件实例(boost)"是一个实践项目,旨在帮助开发者掌握如何利用Boost库,尤其是Boost.Asio,来进行网络通信和...

    上传下载文件.rar

    用户通常需要使用浏览器、FTP客户端或特定的应用程序来完成文件上传。 文件下载则相反,是从服务器获取文件并存储到本地计算机上。同样,这可以通过浏览器、FTP客户端或其他下载工具来实现。下载时,用户需要提供...

    上传下载 发送 压缩 文件

    FTP是一种用于在网络上进行文件传输的标准协议,它允许用户从远程服务器上传或下载文件。FTP提供了两种工作模式:主动模式和被动模式,以适应不同网络环境下的数据传输需求。HTTP则是网页浏览的基础,常用于从Web...

    ftp协议实现多线程断点续传

    FTP(File Transfer Protocol)协议是Internet上用于文件传输的标准协议,它允许用户在两台计算机之间上传、下载文件。在大型文件传输时,如果因为网络问题或其他原因导致传输中断,断点续传功能就显得尤为重要。它...

    可以上传压缩文件,然后进行解压,

    6. **错误处理**:处理可能出现的错误,如文件损坏、解压失败等。 在标签"上传"和"解压"中,我们可以看到"jspapache"这个词汇。这可能是参考了Java服务器页面(JSP)和Apache软件基金会的项目。在Java Web开发中,...

    9_ant_通过ftp发布文件

    标题"9_ant_通过ftp发布文件"和描述暗示了我们将探讨如何使用Ant来通过FTP(File Transfer Protocol)协议上传文件。 FTP是一种用于在互联网上传输文件的标准协议。在Ant中,我们可以使用`ftp`任务来实现这一功能。...

    unix的ftp使用详解

    FTP的主要功能是在客户端和服务器之间传输文件,使得用户可以在自己的计算机(客户端)上访问远程计算机(服务器)上的文件或者将自己的文件上传到远程计算机上。 FTP作为TCP/IP协议簇的一部分,采用了典型的客户机...

    FTP.rar_c builder ftp_ftp

    5. **文件上传**:用户可以选择本地文件上传到FTP服务器。同样,上传也应该支持断点续传,以应对网络不稳定的情况。 6. **文件操作**:用户可能需要执行基本的文件操作,如重命名、删除和创建新目录。 7. **权限...

    FlashFXP-FTP下载上传工具

    FlashFXP是一款功能强大的FTP客户端软件,主要用于进行文件的上传和下载操作。它以其直观的用户界面、高效稳定的工作性能以及丰富的自定义设置而受到广大用户的喜爱。在IT行业中,FTP(File Transfer Protocol)是一...

Global site tag (gtag.js) - Google Analytics