解决第三方多个文件存储在linux上读取路径访问问题

      根据项目需要,需要对接第三,第三方给的文件,和私密要。都需要我们去初始化加载。那么文件存放的位置,成为我们解决的问题。

 

      我们存储的第三方文件应该放哪里。,这就需要根据线上部署不同环境。一下介绍:

 

    1.分布式环境 存放第三方文件。

      由于分布式环境中,linux的路径很难找到。这就需要我们在部署时,自动生成一个linux目录。

    思想:利用流的复制。把我们的随需要第三方文件复制在当前linux运行环境中。

 

    解决方案: 我们首先把。需要加载的第三方文件存在,项目resource目录下的一个包中,

 

 

放置位置好以后我们需要去加载

写一个监听器:

@Service
public class WebappListener implements ApplicationListener<ContextRefreshedEvent> {
    @Autowired
    private ZhongjinPayConfig zhongjinPayConfig;
    private static final Logger logger = LoggerFactory.getLogger(WebappListener.class);
    @Override
    public void onApplicationEvent(ContextRefreshedEvent arg0) {
        onApplication();
        contextInitialized();
    }

    public void contextInitialized() {
        try {
            File directory = new File("");// 参数为空
           String courseFile = directory.getCanonicalPath();
            String paymentConfigPath = courseFile+zhongjinPayConfig.getZhongjinPaymentPath();
            // 初始化系统环境
            InitSystem.initialize(paymentConfigPath);
           
        } catch (Exception e) {
            logger.error(MessageFormat.format("【支付初始化失败】:地址:{0}",zhongjinPayConfig.getZhongjinPaymentPath()));
        }
    }



    public void onApplication() {
        //获取容器资源解析器
        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        String[] source={"/zhongjin/*.pfx","/zhongjin/*.ini","/zhongjin/*.jks","/zhongjin/*.cer"};
        for(int i=0;i<source.length;i++){
            try {
                //获取所有匹配的文件
                Resource[] resources = resolver.getResources(source[i]);
                for(Resource resource : resources) {
                    //获得文件流,因为在jar文件中,不能直接通过文件资源路径拿到文件,但是可以在jar包中拿到文件流
                    InputStream stream = resource.getInputStream();
                    if (logger.isInfoEnabled()) {
                        logger.info("读取的文件流  [" + stream + "]");
                    }
                    String targetFilePath = "zhongjin/"+resource.getFilename();
                    if (logger.isInfoEnabled()) {
                        logger.info("放置位置  [" + targetFilePath + "]");
                    }
                    File file2 = ResourceUtils.getFile(targetFilePath);
                    FileUtils.copyInputStreamToFile(stream, file2);
                }
                logger.debug("复制成功");
            } catch (IOException e) {
                if (logger.isWarnEnabled()) {
                    logger.warn("读取文件流失败,写入本地库失败! " + e);
                }
            }
        }
    }
}

 

//重点就是这个onApplication()会复制成功我们生成一份文件存储。那就是本项目下的一个zhongjin目录下。

 

 这就完美的解决我们linux分布式,请求路径的范围问题。

 

 

2.单独放置一个linux服务器上。  一般这种配置,我们叫做本地配置。就是把文件放置生成环境中目录下。比如、/data/zhongjin

 

这样我们在读取的时候,直接读取固定linux目录即可。

 

posted @ 2019-04-12 12:58  技术专家  阅读(503)  评论(0)    收藏  举报