Java实现跨服务器上传文件功能

网友投稿 475 2023-02-27


Java实现跨服务器上传文件功能

前几天做个项目,本身客户端和管理员端是写在一起的,共用一台服务器,客户上传的文件都是存在服务器的硬盘上的。老龙提出要把客户端和管理员端分离,这时候用户http://上传的附件的存储就出现问题了。显然,把大到几百M的apk文件存到数据库不现实,查了半天,在两端建立ftp服务器传文件是最快的方法。

具体流程是,用户登录外网客户端,上传文件到外网的服务器硬盘上,在此同时,文件通过外网服务器访问内网管理员服务器的ftp服务器,传到内网服务器的硬盘上。这样内网服务器可以对上传的文件进行加密签名工作,之后也通过ftp的方式把文件回传到外网服务器硬盘上,供用户进行其他操作。

具体实现时用到的工具:Serv-U。Serv-U是一个方便我们在windows上建立ftp服务器的工具。下载破解后,按照步骤,设置好Ip、端口、账户密码、允许ftp访问的磁盘路径、操作权限等,就可以使用了。IP在本机测试的时候就选127.0.0.1,内网测试时就选192.168.0.x。

在java项目中的实现,我自己写了个工具类,用到了apache的commons-net包,有上传,下载以及删除功能。附上代码:

package app.ftp;

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.FTPClient;

import org.apache.commons.net.ftp.FTPFile;

import org.apache.commons.net.ftp.FTPReply;

/**

* FTP服务器工具类

*

*/

public class FTPUtils {

/**

* 上传文件至FTP服务器

*

* @param url

* 服务器IP地址

* @param port

* 服务器端口

* @param userName

* 用户登录名

* @param password

* 用户登录密码

* @param storePath

* 服务器文件存储路径

* @param fileName

* 服务器文件存储名称

* @param is

* 文件输入流

* @return

* true:上传成功

*

* false:上传失败

*/

public static boolean storeFile (String url, int port, String userName, String password, String storePath, String fileName, InputStream is) {

boolean result = false;

FTPClient ftp = new FTPClient();

try {

// 连接至服务器,端口默认为21时,可直接通过URL连接

ftp.connect(url ,port);

// 登录服务器

ftp.login(userName, password);

// 判断返回码是否合法

if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {

// 不合法时断开连接

ftp.disconnect();

// 结束程序

return result;

}

// 判断ftp目录是否存在,如果不存在则创建目录,包括创建多级目录

String s = "/"+storePath;

String[] dirs = s.split("/");

ftp.changeWorkingDirectory("/");

//按顺序检查目录是否存在,不存在则创建目录

for(int i=1; dirs!=null&&i

if(!ftp.changeWorkingDirectory(dirs[i])) {

if(ftp.makeDirectory(dirs[i])) {

if(!ftp.changeWorkingDirectory(dirs[i])) {

return false;

}

}else {

return false;

}

}

}

// 设置文件操作目录

ftp.changeWorkingDirectory(storePath);

// 设置文件类型,二进制

ftp.setFileType(FTPClient.BINARY_FILE_TYPE);

// 设置缓冲区大小

ftp.setBufferSize(3072);

// 上传文件

result = ftp.storeFile(fileName, is);

// 关闭输入流

is.close();

// 登出服务器

ftp.logout();

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

// 判断输入流是否存在

if (null != is) {

// 关闭输入流

is.close();

}

// 判断连接是否存在

http:// if (ftp.isConnected()) {

// 断开连接

ftp.disconnect();

}

} catch (IOException e) {

e.printStackTrace();

}

}

return result;

}

/**

* 从FTP服务器下载文件至本地

*

* @param url

* 服务器IP地址

* @param port

* 服务器端口

* @param userName

* 用户登录名

* @param password

* 用户登录密码

* @param remotePath

* 服务器文件存储路径

* @param fileName

* 服务器文件存储名称

* @param localPath

* 本地文件存储路径

* @return

* true:下载成功

*

* false:下载失败

*/

public static boolean retrieveFile (String url, int port, String userName, String password, String remotePath, String fileName, String localPath) {

boolean result = false;

FTPClient ftp = new FTPClient();

OutputStream os = null;

try {

// 连接至服务器,端口默认为21时,可直接通过URL连接

ftp.connect(url ,port);

// 登录服务器

ftp.login(userName, password);

// 判断返回码是否合法

if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {

// 不合法时断开连接

ftp.disconnect();

// 结束程序

return result;

}

// 设置文件操作目录

ftp.changeWorkingDirectory(remotePath);

// 设置文件类型,二进制

ftp.setFileType(FTPClient.BINARY_FILE_TYPE);

// 设置缓冲区大小

ftp.setBufferSize(3072);

// 设置字符编码

ftp.setControlEncoding("UTF-8");

// 构造本地文件对象

File localFile = new File(localPath + "/" + fileName);

// 获取文件操作目录下所有文件名称

String[] remoteNames = ftp.listNames();

// 循环比对文件名称,判断是否含有当前要下载的文件名

for (String remoteName: remoteNames) {

if (fileName.equals(remoteName)) {

result = true;

}

}

// 文件名称比对成功时,进入下载流程

if (result) {

// 构造文件输出流

os = new FileOutputStream(localFile);

// 下载文件

result = ftp.retrieveFile(fileName, os);

// 关闭输出流

os.close();

}

// 登出服务器

ftp.logout();

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

// 判断输出流是否存在

if (null != os) {

// 关闭输出流

os.close();

}

// 判断连接是否存在

if (ftp.isConnected()) {

// 断开连接

ftp.disconnect();

}

} catch (IOException e) {

e.printStackTrace();

}

}

return result;

}

/**

* 从FTP服务器删除文件

*

* @param url

* 服务器IP地址

* @param port

* 服务器端口

* @param userName

* 用户登录名

* @param password

* 用户登录密码

* @param remotePath

* 服务器文件存储路径

* @param fileName

* 服务器文件存储名称

* @return

* true:删除成功

*

* false:删除失败

*/

public static boolean deleteFile (String url, int port, String userName, String password, String remotePath, String fileName) {

boolean result = false;

FTPClient ftp = new FTPClient();

try {

// 连接至服务器,端口默认为21时,可直接通过URL连接

ftp.connect(url ,port);

// 登录服务器

ftp.login(userName, password);

// 判断返回码是否合法

if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {

// 不合法时断开连接

ftp.disconnect();

// 结束程序

return result;

}

// 设置文件操作目录

ftp.changeWorkingDirectory(remotePath);

// 设置文件类型,二进制

ftp.setFileType(FTPClient.BINARY_FILE_TYPE);

// 设置缓冲区大小

ftp.setBufferSize(3072);

// 设置字符编码

ftp.setControlEncoding("UTF-8");

// 获取文件操作目录下所有文件名称

String[] remoteNames = ftp.listNames();

// 循环比对文件名称,判断是否含有当前要下载的文件名

for (String remoteNhttp://ame: remoteNames) {

if (fileName.equals(remoteName)) {

result = true;

}

}

// 文件名称比对成功时,进入删除流程

if (result) {

// 删除文件

result = ftp.deleteFile(fileName);

}

// 登出服务器

ftp.logout();

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

// 判断连接是否存在

if (ftp.isConnected()) {

// 断开连接

ftp.disconnect();

}

} catch (IOException e) {

e.printStackTrace();

}

}

return result;

}

public static void main(String[] args) throws FileNotFoundException {

// try {

// FileInputStream fis = new FileInputStream(new File("D:/Soft Storage/软件工具箱/HTML_Help_WorkShop_1.3_XiaZaiBa.zip"));

// System.out.println(storeFile("192.168.1.2", 21, "admin", "1", "C:/Documents and Settings/Administrator/桌面", RandomUUID.random() + ".zip", fis));

// } catch (FileNotFoundException e) {

// e.printStackTrace(qgandVqN);

// }

//

//File file = new File("C:/Users/freed/Desktop/1.txt");

//InputStream is = new FileInputStream(file);

//System.out.println(storeFile("127.0.0.1", 21, "feili", "feili", "examples", "2.txt", is));

//System.out.println(retrieveFile("127.0.0.1", 21, "feili", "feili", "examples/jsp", "index.html", "C:/Users/freed/Desktop"));

//System.out.println(deleteFile("127.0.0.1", 21, "feili", "feili", "testpath", "1.txt"));

}

}

需要注意的是上传文件的时候要将File文件先放入fileinputstream中。

if(!ftp.changeWorkingDirectory(dirs[i])) {

if(ftp.makeDirectory(dirs[i])) {

if(!ftp.changeWorkingDirectory(dirs[i])) {

return false;

}

}else {

return false;

}

}

}

// 设置文件操作目录

ftp.changeWorkingDirectory(storePath);

// 设置文件类型,二进制

ftp.setFileType(FTPClient.BINARY_FILE_TYPE);

// 设置缓冲区大小

ftp.setBufferSize(3072);

// 上传文件

result = ftp.storeFile(fileName, is);

// 关闭输入流

is.close();

// 登出服务器

ftp.logout();

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

// 判断输入流是否存在

if (null != is) {

// 关闭输入流

is.close();

}

// 判断连接是否存在

http:// if (ftp.isConnected()) {

// 断开连接

ftp.disconnect();

}

} catch (IOException e) {

e.printStackTrace();

}

}

return result;

}

/**

* 从FTP服务器下载文件至本地

*

* @param url

* 服务器IP地址

* @param port

* 服务器端口

* @param userName

* 用户登录名

* @param password

* 用户登录密码

* @param remotePath

* 服务器文件存储路径

* @param fileName

* 服务器文件存储名称

* @param localPath

* 本地文件存储路径

* @return

* true:下载成功

*

* false:下载失败

*/

public static boolean retrieveFile (String url, int port, String userName, String password, String remotePath, String fileName, String localPath) {

boolean result = false;

FTPClient ftp = new FTPClient();

OutputStream os = null;

try {

// 连接至服务器,端口默认为21时,可直接通过URL连接

ftp.connect(url ,port);

// 登录服务器

ftp.login(userName, password);

// 判断返回码是否合法

if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {

// 不合法时断开连接

ftp.disconnect();

// 结束程序

return result;

}

// 设置文件操作目录

ftp.changeWorkingDirectory(remotePath);

// 设置文件类型,二进制

ftp.setFileType(FTPClient.BINARY_FILE_TYPE);

// 设置缓冲区大小

ftp.setBufferSize(3072);

// 设置字符编码

ftp.setControlEncoding("UTF-8");

// 构造本地文件对象

File localFile = new File(localPath + "/" + fileName);

// 获取文件操作目录下所有文件名称

String[] remoteNames = ftp.listNames();

// 循环比对文件名称,判断是否含有当前要下载的文件名

for (String remoteName: remoteNames) {

if (fileName.equals(remoteName)) {

result = true;

}

}

// 文件名称比对成功时,进入下载流程

if (result) {

// 构造文件输出流

os = new FileOutputStream(localFile);

// 下载文件

result = ftp.retrieveFile(fileName, os);

// 关闭输出流

os.close();

}

// 登出服务器

ftp.logout();

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

// 判断输出流是否存在

if (null != os) {

// 关闭输出流

os.close();

}

// 判断连接是否存在

if (ftp.isConnected()) {

// 断开连接

ftp.disconnect();

}

} catch (IOException e) {

e.printStackTrace();

}

}

return result;

}

/**

* 从FTP服务器删除文件

*

* @param url

* 服务器IP地址

* @param port

* 服务器端口

* @param userName

* 用户登录名

* @param password

* 用户登录密码

* @param remotePath

* 服务器文件存储路径

* @param fileName

* 服务器文件存储名称

* @return

* true:删除成功

*

* false:删除失败

*/

public static boolean deleteFile (String url, int port, String userName, String password, String remotePath, String fileName) {

boolean result = false;

FTPClient ftp = new FTPClient();

try {

// 连接至服务器,端口默认为21时,可直接通过URL连接

ftp.connect(url ,port);

// 登录服务器

ftp.login(userName, password);

// 判断返回码是否合法

if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {

// 不合法时断开连接

ftp.disconnect();

// 结束程序

return result;

}

// 设置文件操作目录

ftp.changeWorkingDirectory(remotePath);

// 设置文件类型,二进制

ftp.setFileType(FTPClient.BINARY_FILE_TYPE);

// 设置缓冲区大小

ftp.setBufferSize(3072);

// 设置字符编码

ftp.setControlEncoding("UTF-8");

// 获取文件操作目录下所有文件名称

String[] remoteNames = ftp.listNames();

// 循环比对文件名称,判断是否含有当前要下载的文件名

for (String remoteNhttp://ame: remoteNames) {

if (fileName.equals(remoteName)) {

result = true;

}

}

// 文件名称比对成功时,进入删除流程

if (result) {

// 删除文件

result = ftp.deleteFile(fileName);

}

// 登出服务器

ftp.logout();

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

// 判断连接是否存在

if (ftp.isConnected()) {

// 断开连接

ftp.disconnect();

}

} catch (IOException e) {

e.printStackTrace();

}

}

return result;

}

public static void main(String[] args) throws FileNotFoundException {

// try {

// FileInputStream fis = new FileInputStream(new File("D:/Soft Storage/软件工具箱/HTML_Help_WorkShop_1.3_XiaZaiBa.zip"));

// System.out.println(storeFile("192.168.1.2", 21, "admin", "1", "C:/Documents and Settings/Administrator/桌面", RandomUUID.random() + ".zip", fis));

// } catch (FileNotFoundException e) {

// e.printStackTrace(qgandVqN);

// }

//

//File file = new File("C:/Users/freed/Desktop/1.txt");

//InputStream is = new FileInputStream(file);

//System.out.println(storeFile("127.0.0.1", 21, "feili", "feili", "examples", "2.txt", is));

//System.out.println(retrieveFile("127.0.0.1", 21, "feili", "feili", "examples/jsp", "index.html", "C:/Users/freed/Desktop"));

//System.out.println(deleteFile("127.0.0.1", 21, "feili", "feili", "testpath", "1.txt"));

}

}

需要注意的是上传文件的时候要将File文件先放入fileinputstream中。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SpringBoot快速设置拦截器并实现权限验证的方法
下一篇:微信小程序实现的涂鸦功能示例【附源码下载】
相关文章

 发表评论

暂时没有评论,来抢沙发吧~