需求描述:
如果想学习Java工程化、高性能及分布式、深入浅出。微服务、,,Netty源码分析的朋友可以加我的Java高级交流:,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。
客户出完账之后需要把出账的数据以文本文件的方式传送给收入管理系统,客户以前是通过本地的一个工具软件上传的,由于安全监管的原因,不允许在本地使用工具上传,因此客户希望我们在已经上线使用的系统开发一个功能实现他们的需求。
业务梳理:
我梳理一下具体的细节,具体的流程如图所示:
程序实现:
一、首先是设计页面,由于是在原系统的基础上新增功能,需要提前做好菜单的配置工作。我设计的页面如下图,一个是下拉选择框(用户选择相对应的业务),一个是选择文件,一个是月份(表示需要传送的文件是哪个月),一个是上传按钮,用户选择文件之后选择月份点击上传按钮之后即可触发上传操作。
以下是JSP界面的源码:
业务类型
接口月份:
="date6" ="true" =" -">
选择文件
二、点击上传按钮之后的函数为:(),提交的请求为.do
系统是由实现的,因此要在配置中加入这一段请求相对应的的配置
class="aicu..mps.voice..web..">
/WEB-INF/jsp//.jsp
三、做好了相对应的准备工作,继续来写接下来的业务逻辑。
编写aicu..mps.voice..web..类
aicu..mps.voice..web.;
aicu..mps.voice..web..;
class {
() {
.out.("hello");
();
;
}
}
由于继承了,所以相对应的请求都会由>的()来处理。
首先是获取上传上来的文件对象,通过声明上传文件的对象,内容类型,文件名,服务ID,然后在生成set()方法和get()方法便能获取到文件对象。
File ;// 实际上传文件
; // 文件的内容类型
; // 上传文件名
;//上传服务ID
File () {
;
}
void (File ) {
this. = ;
}
() {
;
}
void ( ) {
this. = ;
}
() {
;
}
void ( ) {
this. = ;
}
() {
;
}
void ( ) {
this. = ;
}
然后是对当前的文本文件进行MD5加密,生成同名的MD5文件,文件中只有一行加密之后的MD5字符串。
由于通过上传的文件是存放在临时目录下,我处理的思路是,先把文件copy到指定的路径下
= ()+""+File.+UUID.()+File.;
File =new File(new File(),);
if (!.().())
.().();
.(, );
然后是生成MD5同名文件
=new ();
=.();
实现的思路是调用方法得到加密之后MD5的字符串,通过实现把文本写入同名的MD5文件中。类的(File file)方法:
(File file) {
bool = false;
fis = null;
=file.();
[] =.split("\.");
= file.()+file.+[0]+ ".md5";
File = new File();
try {
md = .("MD5");
fis = new (file);
byte[] = new byte[2048];
int = -1;
long s = .();
while (( = fis.read()) != -1) {
md.(, 0, );
}
byte[] b = md.();
=(b);
if (!.()) {
.();
bool = true;
.out.(" file,the file is "
+ .());
(, );
}
else {
.();
.out.(" file,the file is "
+ .());
.();
bool = true;
.out.(" file,the file is "
+ .());
(, );
}
(b);
} catch ( ex) {
ex.();
null;
} {
try {
fis.close();
} catch ( ex) {
ex.();
}
}
}
方法,主要是实现对文本文件的MD5加密,得到加密之后的MD5文件
(byte[] tmp) {
s;
char str[] = new char[16 * 2];
int k = 0;
for (int i = 0; i < 16; i++) {
byte byte0 = tmp[i];
str[k++] = [byte0 >>> 4 & 0xf];
str[k++] = [byte0 & 0xf];
}
s = new (str);
s;
}
方法,实现把文本写入同名的MD5文件中
( , ) {
bool = false;
// = + "rn";
= new ();
temp = "";
fis = null;
isr = null;
br = null;
fos = null;
pw = null;
try {
File file = new File();
fis = new (file);
isr = new (fis);
br = new (isr);
= new ();
for (int i = 0; (temp = br.()) != null; i++) {
.(temp);
= .(.("line."));
}
.();
fos = new (file);
pw = new (fos);
pw.write(.().());
pw.flush();
bool = true;
} catch ( e) {
e.();
} {
if (pw != null) {
pw.close();
}
if (fos != null) {
fos.close();
}
if (br != null) {
br.close();
}
if (isr != null) {
isr.close();
}
if (fis != null) {
fis.close();
}
}
bool;
}
四、获取到文本文件和生成同名的文件名之后,紧接着就是获取相对应的ftp主机,用户名,密码以及路径信息了。我把这相对应的信息保存在数据库中。首先我们把获取到的业务类型放入一个中。
=new ();
.put("",);
然后我们配置的sqlid
然后执行该sqlid的查询java 发送文件 Java实现对文本文件MD5加密并ftp传送到远程主机目录,把结果放入List 中
List =tis.("",false,);
下面是根据该sqlid查询出来的List结果中,取出相关的信息
host = ().get(0).get("");
user = ().get(0).get("");
pass = ().get(0).get("");
path = ().get(0).get("");
//每月会自动生成一个月份的子目录
=path++"/";
至此,便可以获取到相对应的ftp主机java 发送文件,用户名,密码以及路径信息了。
五、最后一步是实现上传,我是用的来实现的。
实现的操作都写在了的方法中,其中表示需要传送文件的目录。
.().(, host, user, pass, );
的方法如下所示:
void ( , host, user,
pass, path) {
login(host, 21, user, pass);
File = new File();
File[] files = .();
= path;
for (File aFile : files) {
if (aFile != null && aFile.() != null) {
put(aFile, , new ((aFile.())
.(""), "-1"));
}
}
();
}
总结
本篇文章描写了Java如何实现对某一目录下的文件夹下的文本文件实现MD5加密,并生成同名的MD5文件,根据配置信息,获取主机ip,用户名密码java 发送文件,传送的路径,然后实现ftp远程传送功能。如果你有类似的需求,希望可以帮助到你,或者你能从中获取到灵感。
如果想学习Java工程化、高性能及分布式、深入浅出。微服务、,,Netty源码分析的朋友可以加我的Java高级交流:,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。