你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

从第三方服务器拉取的文件解压到自己项目中

2021/12/30 22:34:56

最近有个需求,需要从第三方公司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;
    }

总结:尤其是涉及到项目中文件上传下载的问题,本地测试成功,测试环境并不一定好使;本地测试不行的,测试环境不一定不好使。所以,在本地没法解决,但感觉思路或者逻辑没问题的时候,不妨去测试环境试试,说不定会有惊喜呢。

今天就分享到这里吧,希望能帮助一些小伙伴。有时候坚持一件事确实很难,但只要坚持了,就一定会有收获!