最近有个需求,需要从第三方公司FTP服务器拉取数据;将数据存入自己的oss服务器备份,然后将拉去的数据解密,获取内容。但是三方的解密方式是,将数据解密到一个临时文件,但是公司的oss只能上传和下载,不允许直接解密到服务器中。
既然不能用oss,只能将数据解压到自己的项目中了,在将数据解压到本地项目中的时候 遇到了很多问题,主要是本地测试跟服务器测试的不同导致的。先说下问题吧,当时的想法是将文件流写入resources目录下temp下面,本地测试的时候发现,解压路径必须是固定的盘符才可以,直接写项目的相对路径,一直失败。也试了很多方法,都不行。
解决方法:感觉获取路径方法没问题,于是我写了好几个获取路径的方法,然后打上日志,因为有了之前下载excel的教训,最后决定去测试服务器试试,看有没有方法在测试环境可以实现。结果发现,Linux跟window确实还是有差异的,本地测试不行的方法,在测试环境可以成功解密并写入到项目中了。下面贴代码:
// 保存加密的临时文件到项目中
path = this.getClass().getResource("/temp/").getPath();
log.info("文件路径={}",path);
IoUtil.write(new FileOutputStream( path + "old.txt"), true, byteMsg);
下面这个文件就是解密类,其实就是把源文件解密到一个临时文件。
/**
* 解密
*
* @param fileUrl 源文件
* @param tempUrl 临时文件
* @param keyLength 密码长度
*/
public static String decrypt(String fileUrl, String tempUrl, int keyLength) throws IOException {
File file = new File(fileUrl);
if (!file.exists()) {
return null;
}
File dest = new File(tempUrl);
if (!dest.getParentFile().exists()) {
dest.getParentFile().mkdirs();
}
InputStream is = new FileInputStream(fileUrl);
OutputStream out = new FileOutputStream(tempUrl);
byte[] buffer = new byte[1024];
byte[] buffer2 = new byte[1024];
byte bMax = (byte) 255;
long size = file.length() - keyLength;
int mod = (int) (size % 1024);
int div = (int) (size >> 10);
int count = mod == 0 ? div : (div + 1);
int k = 1, r;
while ((k <= count && (r = is.read(buffer)) > 0)) {
if (mod != 0 && k == count) {
r = mod;
}
for (int i = 0; i < r; i++) {
byte b = buffer[i];
buffer2[i] = b == 0 ? bMax : --b;
}
out.write(buffer2, 0, r);
k++;
}
out.close();
is.close();
return tempUrl;
}
总结:尤其是涉及到项目中文件上传下载的问题,本地测试成功,测试环境并不一定好使;本地测试不行的,测试环境不一定不好使。所以,在本地没法解决,但感觉思路或者逻辑没问题的时候,不妨去测试环境试试,说不定会有惊喜呢。
今天就分享到这里吧,希望能帮助一些小伙伴。有时候坚持一件事确实很难,但只要坚持了,就一定会有收获!