Flask接口签名sign原理与实例代码浅析
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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~