用java怎么获取ftp上的文件

用java怎么获取ftp上的文件,第1张

public class FtpClientUtil {

FtpClient ftpClient

private String server

private int port

private String userName

private String userPassword

public FtpClientUtil(String server,int port,String userName,String userPassword)

{

this.server=server

this.port=port

this.userName=userName

this.userPassword=userPassword

}

/**

* 链接到服务器

* @return

*/

public boolean open()

{

if(ftpClient!=null&&ftpClient.serverIsOpen())

return true

try

{

ftpClient= new FtpClient()

ftpClient.openServer(server,port)

ftpClient.login(userName, userPassword)

ftpClient.binary()

return true

}

catch(Exception e)

{

e.printStackTrace()

ftpClient=null

return false

}

}

public boolean cd(String dir){

boolean f = false

try {

ftpClient.cd(dir)

} catch (IOException e) {

Logs.error(e.toString())

return f

}

return true

}

/**

* 上传文件到FTP服务器

* @param localPathAndFileName 本地文件目录和文件名

* @param ftpFileName 上传后的文件名

* @param ftpDirectory FTP目录如:/path1/pathb2/,如果目录不存在回自动创建目录

* @throws Exception

*/

public boolean upload(String localDirectoryAndFileName,String ftpFileName,String ftpDirectory)throws Exception {

if(!open())

return false

FileInputStream is=null

TelnetOutputStream os=null

try

{

char ch = ' '

if (ftpDirectory.length() >0)

ch = ftpDirectory.charAt(ftpDirectory.length() - 1)

for (ch == '/' || ch == '\\'ch = ftpDirectory.charAt(ftpDirectory.length() - 1))

ftpDirectory = ftpDirectory.substring(0, ftpDirectory.length() - 1)

int slashIndex = ftpDirectory.indexOf(47)

int backslashIndex = ftpDirectory.indexOf(92)

int index = slashIndex

String dirall = ftpDirectory

if (backslashIndex != -1 &&(index == -1 || index >backslashIndex))

index = backslashIndex

String directory = ""烂激袭铅启

while (index != -1) {

if (index >0) {

String dir = dirall.substring(0, index)

directory = directory + "/"饥兄 + dir

ftpClient.sendServer("XMKD " + directory + "\r\n")

ftpClient.readServerResponse()

}

dirall = dirall.substring(index + 1)

slashIndex = dirall.indexOf(47)

backslashIndex = dirall.indexOf(92)

index = slashIndex

if (backslashIndex != -1 &&(index == -1 || index >backslashIndex))

index = backslashIndex

}

ftpClient.sendServer("XMKD " + ftpDirectory + "\r\n")

ftpClient.readServerResponse()

os = ftpClient.put(ftpDirectory + "/"

+ ftpFileName)

File file_in = new File(localDirectoryAndFileName)

is = new FileInputStream(file_in)

byte bytes[] = new byte[1024]

int i

while ((i = is.read(bytes)) != -1)

os.write(bytes, 0, i)

//清理垃圾

return true

}

catch(Exception e)

{

e.printStackTrace()

return false

}

finally

{

if (is != null)

is.close()

if (os != null)

os.close()

}

}

/**

* 从FTP服务器上下载文件并返回下载文件长度

* @param ftpDirectoryAndFileName

* @param localDirectoryAndFileName

* @return

* @throws Exception

*/

public long download(String ftpDirectoryAndFileName,String localDirectoryAndFileName)throws Exception

{

long result = 0

if(!open())

return result

TelnetInputStream is = null

FileOutputStream os = null

try

{

is = ftpClient.get(ftpDirectoryAndFileName)

java.io.File outfile = new java.io.File(localDirectoryAndFileName)

os = new FileOutputStream(outfile)

byte[] bytes = new byte[1024]

int c

while ((c = is.read(bytes)) != -1)

{

os.write(bytes, 0, c)

result = result + c

}

}

catch (Exception e)

{

throw e

}

finally

{

if (is != null)

is.close()

if (os != null)

os.close()

}

return result

}

/**

* 返回FTP目录下的文件列表

* @param ftpDirectory

* @return

*/

public List<String>getFileNameList(String ftpDirectory)

{

List<String>list = new ArrayList<String>()

if(!open())

return list

try

{

DataInputStream dis = new DataInputStream(ftpClient.nameList(ftpDirectory))

String filename = ""

while((filename=dis.readLine())!=null)

{

list.add(filename)

}

} catch (Exception e)

{

e.printStackTrace()

}

return list

}

/**

* 删除FTP上的文件

* @param ftpDirAndFileName

*/

public boolean deleteFile(String ftpDirAndFileName)

{

if(!open())

return false

ftpClient.sendServer("DELE "+ftpDirAndFileName+"\r\n")

return true

}

/**

* 删除FTP目录

* @param ftpDirectory

*/

public boolean deleteDirectory(String ftpDirectory)

{

if(!open())

return false

ftpClient.sendServer("XRMD "+ftpDirectory+"\r\n")

return true

}

/**

* 关闭链接

*/

public void close()

{

try

{

if(ftpClient!=null&&ftpClient.serverIsOpen())

ftpClient.closeServer()

}catch(Exception e)

{

}

}

}望采纳,谢谢。

package com.weixin.util

import java.io.File

import java.io.FileOutputStream

import java.io.IOException

import java.io.InputStream

import java.io.OutputStream

import java.io.PrintWriter

import java.io.RandomAccessFile

import org.apache.commons.net.PrintCommandListener

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

import com.weixin.constant.DownloadStatus

import com.weixin.constant.UploadStatus

/**

* 支持断点续传的FTP实用类

* @version 0.1 实现基本断点上传下载

* @version 0.2 实现上传下载进度汇报

* @version 0.3 实现中文目录创建及中文文件创建,添加对于中文的支持

*/

public class ContinueFTP {

public FTPClient ftpClient = new FTPClient()

public ContinueFTP(){

//设置将过程中使用到的命令输出到控制台

this.ftpClient.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)))

}

/**

* 连接到FTP服务器

* @param hostname 主机名

* @param port 端口

* @param username 用户名

* @param password 密码

* @return 是否连接成功

* @throws IOException

*/

public boolean connect(String hostname,int port,String username,String password) throws IOException{

ftpClient.connect(hostname, port)

ftpClient.setControlEncoding("GBK")

if(FTPReply.isPositiveCompletion(ftpClient.getReplyCode())){

if(ftpClient.login(username, password)){

return true

}

}

disconnect()

return false

}

/**

* 从FTP服务器上下载文件,支持断点续传,上传百分比汇报

* @param remote 远程文件路径

* @param local 本地文件路径

* @return 上传的状态

* @throws IOException

*/

public DownloadStatus download(String remote,String local) throws IOException{

//设置档肆被动模式

ftpClient.enterLocalPassiveMode()

//设置以二进制方式传输

ftpClient.setFileType(FTP.BINARY_FILE_TYPE)

DownloadStatus result

//检查洞燃远程文件是否存在

FTPFile[] files = ftpClient.listFiles(new String(remote.getBytes("GBK"),"iso-8859-1"))

if(files.length != 1){

System.out.println("远程文件不存在")

return DownloadStatus.Remote_File_Noexist

}

long lRemoteSize = files[0].getSize()

File f = new File(local)

//本地存在文件,进行断点下载

if(f.exists()){

long localSize = f.length()

//判断本地文件大小是否大于远程文件大小

if(localSize >= lRemoteSize){

System.out.println("本地文件大于远程文件,下载中止")

return DownloadStatus.Local_Bigger_Remote

}

//进行断点续传,并记录状态

FileOutputStream out = new FileOutputStream(f,true)

ftpClient.setRestartOffset(localSize)

InputStream in = ftpClient.retrieveFileStream(new String(remote.getBytes("GBK"),"iso-8859-1"))

byte[] bytes = new byte[1024]

long step = lRemoteSize /100

long process=localSize /step

int c

while((c = in.read(bytes))!= -1){

out.write(bytes,0,c)

localSize+=c

long nowProcess = localSize /step

if(nowProcess >process){

process = nowProcess

if(process % 10 == 0)

System.out.println("下载进度:"+process)

//TODO 更新文件下载进度,值存放在process变量中

}

}

in.close()

out.close()

boolean isDo = ftpClient.completePendingCommand()

if(isDo){

result = DownloadStatus.Download_From_Break_Success

}else {

result = DownloadStatus.Download_From_Break_Failed

}

}else {

OutputStream out = new FileOutputStream(f)

InputStream in= ftpClient.retrieveFileStream(new String(remote.getBytes("GBK"),"iso-8859-1"))

byte[] bytes = new byte[1024]

long step = lRemoteSize /100

long process=0

long localSize = 0L

int c

while((c = in.read(bytes))!= -1){

out.write(bytes, 0, c)

localSize+=c

long nowProcess = localSize /step

if(nowProcess >process){

process = nowProcess

if(process % 10 == 0)

System.out.println("下载进度:"+process)

//TODO 更新文件下载进度,值存放在process变量中

}

}

in.close()

out.close()

boolean upNewStatus = ftpClient.completePendingCommand()

if(upNewStatus){

result = DownloadStatus.Download_New_Success

}else {

result = DownloadStatus.Download_New_Failed

}

}

return result

}

/**

* 上传文件到FTP服务器,支持断点续传

* @param local 本地文件名称,绝对路径

* @param remote 远程文件路径,使用/home/directory1/subdirectory/file.ext 按照Linux上的路径指定方式,支持多级目录嵌套,支持递归创建不存在的目录结构

* @return 上传结果

* @throws IOException

*/

public UploadStatus upload(String local,String remote) throws IOException{

//设置PassiveMode传输

ftpClient.enterLocalPassiveMode()

//设置以二进制流的方式传输

ftpClient.setFileType(FTP.BINARY_FILE_TYPE)

ftpClient.setControlEncoding("GBK")

UploadStatus result

//对远程目录的处理

String remoteFileName = remote

if(remote.contains("/")){

remoteFileName = remote.substring(remote.lastIndexOf("/")+1)

//创建服务器远程目录结构,创建失败直接返回

if(CreateDirecroty(remote, ftpClient)==UploadStatus.Create_Directory_Fail){

return UploadStatus.Create_Directory_Fail

}

}

//检查远程是否存在文件

FTPFile[] files = ftpClient.listFiles(new String(remoteFileName.getBytes("GBK"),"iso-8859-1"))

if(files.length == 1){

long remoteSize = files[0].getSize()

File f = new File(local)

long localSize = f.length()

if(remoteSize==localSize){

return UploadStatus.File_Exits

}else if(remoteSize >localSize){

return UploadStatus.Remote_Bigger_Local

}

//尝试移动文件内读取指针,实现断点续传

result = uploadFile(remoteFileName, f, ftpClient, remoteSize)

//如果断点续传没有成功,则删除服务器上文件,重新上传

if(result == UploadStatus.Upload_From_Break_Failed){

if(!ftpClient.deleteFile(remoteFileName)){

return UploadStatus.Delete_Remote_Faild

}

result = uploadFile(remoteFileName, f, ftpClient, 0)

}

}else {

result = uploadFile(remoteFileName, new File(local), ftpClient, 0)

}

return result

}

/**

* 断开与远程服务器的连接

* @throws IOException

*/

public void disconnect() throws IOException{

if(ftpClient.isConnected()){

ftpClient.disconnect()

}

}

/**

* 递归创建远程服务器目录

* @param remote 远程服务器文件绝对路径

* @param ftpClient FTPClient对象

* @return 目录创建是否成功

* @throws IOException

*/

public UploadStatus CreateDirecroty(String remote,FTPClient ftpClient) throws IOException{

UploadStatus status = UploadStatus.Create_Directory_Success

String directory = remote.substring(0,remote.lastIndexOf("/")+1)

if(!directory.equalsIgnoreCase("/")&&!ftpClient.changeWorkingDirectory(new String(directory.getBytes("GBK"),"iso-8859-1"))){

//如果远程目录不存在,则递归创建远程服务器目录

int start=0

int end = 0

if(directory.startsWith("/")){

start = 1

}else{

start = 0

}

end = directory.indexOf("/",start)

while(true){

String subDirectory = new String(remote.substring(start,end).getBytes("GBK"),"iso-8859-1")

if(!ftpClient.changeWorkingDirectory(subDirectory)){

if(ftpClient.makeDirectory(subDirectory)){

ftpClient.changeWorkingDirectory(subDirectory)

}else {

System.out.println("创建目录失败")

return UploadStatus.Create_Directory_Fail

}

}

start = end + 1

end = directory.indexOf("/",start)

//检查所有目录是否创建完毕

if(end <= start){

break

}

}

}

return status

}

/**

* 上传文件到服务器,新上传和断点续传

* @param remoteFile 远程文件名,在上传之前已经将服务器工作目录做了改变

* @param localFile 本地文件File句柄,绝对路径

* @param processStep 需要显示的处理进度步进值

* @param ftpClient FTPClient引用

* @return

* @throws IOException

*/

public UploadStatus uploadFile(String remoteFile,File localFile,FTPClient ftpClient,long remoteSize) throws IOException{

UploadStatus status

//显示进度的上传

long step = localFile.length() / 100

long process = 0

long localreadbytes = 0L

RandomAccessFile raf = new RandomAccessFile(localFile,"r")

OutputStream out = ftpClient.appendFileStream(new String(remoteFile.getBytes("GBK"),"iso-8859-1"))

//断点续传

if(remoteSize>0){

ftpClient.setRestartOffset(remoteSize)

process = remoteSize /step

raf.seek(remoteSize)

localreadbytes = remoteSize

}

byte[] bytes = new byte[1024]

int c

while((c = raf.read(bytes))!= -1){

out.write(bytes,0,c)

localreadbytes+=c

if(localreadbytes / step != process){

process = localreadbytes / step

System.out.println("上传进度:" + process)

//TODO 汇报上传状态

}

}

out.flush()

raf.close()

out.close()

boolean result =ftpClient.completePendingCommand()

if(remoteSize >0){

status = result?UploadStatus.Upload_From_Break_Success:UploadStatus.Upload_From_Break_Failed

}else {

status = result?UploadStatus.Upload_New_File_Success:UploadStatus.Upload_New_File_Failed

}

return status

}

public static void main(String[] args) {

ContinueFTP myFtp = new ContinueFTP()

try {

System.err.println(myFtp.connect("10.10.6.236", 21, "5", "jieyan"))

// myFtp.ftpClient.makeDirectory(new String("歌曲".getBytes("GBK"),"iso-8859-1"))

// myFtp.ftpClient.changeWorkingDirectory(new String("歌曲".getBytes("GBK"),"iso-8859-1"))

// myFtp.ftpClient.makeDirectory(new String("爱你等于爱自己".getBytes("GBK"),"iso-8859-1"))

// System.out.println(myFtp.upload("E:\\yw.flv", "/yw.flv",5))

// System.out.println(myFtp.upload("E:\\爱你等于爱自己.mp4","/爱你等于爱自己.mp4"))

//System.out.println(myFtp.download("/爱你等于爱自己.mp4", "E:\\爱你等于爱自己.mp4"))

myFtp.disconnect()

} catch (IOException e) {

System.out.println("连接FTP出错:"+e.getMessage())

}

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/8217810.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存