远程调用接口传输文件(二)

  • 通过文件名,获取文件
  • 远程调用接口拿到文件的byte[]后再处理进行返回文件给前端页面

调用方接口

 @RequestMapping("/download")
    public void download(String filename, HttpServletRequest request, HttpServletResponse response) {
        try {
            if (StringUtils.isNotBlank(filename)) {
                byte[] bs = localStoreDirConfig.getFileInputStreamByExport(filename);
                if (bs != null){
                    try (ServletOutputStream os = response.getOutputStream()){
                        //获取文件后缀(.txt)
                        String extendFileName = FileUtil.getSuffix(filename);
                        //动态设置响应类型,根据前台传递文件类型设置响应类型
                        response.setContentType(request.getSession().getServletContext().getMimeType(extendFileName));
                        //设置响应头,attachment表示以附件的形式下载,inline表示在线打开
                        response.setHeader("content-disposition","attachment;fileName="+ URLEncoder.encode("交互回复记录.xlsx","UTF-8"));
                        // 写入文件字节
                        os.write(bs);
                        os.flush();
                    }catch (Exception e){
                        log.error("异常",e);
                    }
                }
            }
        } catch (Exception e) {
            log.error("下载文件异常",e);
        }
    }
public byte[] getFileInputStreamByExport(String fileName) throws Exception{
        return getBytes(fileName,"byExport");
    }
  • yml自定义了其他应用的地址,这里进行遍历逐个寻找
private byte[] getBytes(String fileName,String by) throws Exception{
        String dir = by.equals("byImport") ?uploadFileStoreDir:exportFileStoreDir + "/";
        File localFile = new File(dir + fileName);

        // 从当前 boss 服务拿
        if (localFile.exists() && localFile.isFile()){
            try (
                    FileInputStream fis = new FileInputStream(localFile);
                    ByteArrayOutputStream baos = new ByteArrayOutputStream()
            ){
                byte[] bytes = new byte[2048];
                int length;
                while ((length = fis.read(bytes)) != -1) {
                    baos.write(bytes, 0 ,length);
                }

                return baos.toByteArray();
            }
        }

        // 从其他 boss 服务拿
        for (BossServer server : otherBossServerConfig.otherBossProperties().getServers()) {
            String url = String.format("http://%s:%s/remote/getFile/%s/%s", server.getIp(), server.getPort(), by,fileName);
            try {
                try (HttpResponse resp = HttpRequest.post(url).timeout(30*1000).execute()) {
                    log.info("callRemoteSyncApi url:{} | by:{} | fileName:{} | resp sta:{}",url,by, fileName, resp.getStatus());

                    byte[] bs = resp.bodyBytes();
                    if (bs != null){
                        try (FileOutputStream f = new FileOutputStream(dir + fileName)){
                            f.write(bs);
                            f.flush();
                        }catch (Exception e){
                            log.error("远程获取的文件,懒备份到本地 localPath:{} | fileName:{} | by:{}",dir,fileName,by);
                        }
                        return bs;
                    }
                }catch (Exception e){
                    log.info("callRemoteSyncApi 异常 url:{} | by:{} | fileName:{}",url,by, fileName,e);
                }
            } catch (Exception e) {
                log.info("callRemoteSyncApi 异常 url:{}", url, e);
            }
        }

        return null;
    }

被调用方远程接口

 @PostMapping("/getFile/{from}/{fileName}")
    public void getFile(@PathVariable("from") String from, @PathVariable("fileName") String fileName, HttpServletResponse response) throws Exception{
        byte[] bs = null;
        bs = localStoreDirConfig.getFileInputStreamByExport(fileName);
        if (bs != null && bs.length >0){
            try (ServletOutputStream ops = response.getOutputStream()){
                ops.write(bs);
                ops.flush();
            }
        }

    }
  • 和以上调用方接口里的方法是同一个~
     public byte[] getFileInputStreamByExport(String fileName) throws Exception{
        return getBytes(fileName,"byExport");
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java远程调用SOAP协议接口可以通过以下步骤实现: 1.首先,根据需要创建Java项目,可以使用Eclipse或其他Java开发工具。 2.在项目中导入相关的SOAP协议库,例如Apache Axis2或Apache CXF等。 3.根据接口的WSDL(Web Service Description Language)文件生成客户端代码。可以使用Axis2提供的WSDL2Java工具或CXF提供的wsdl2java命令来实现。这将根据WSDL文件生成相应的Java类和接口。 4.使用生成的客户端类和接口编写客户端代码。首先,创建一个调用服务的Java类。在该类中,实例化接口类并设置访问所需的URL、服务名称和命名空间等。然后,可以调用接口中的方法来实现具体的远程调用。 5.在方法中,根据接口方法的参数,创建所需的SOAP消息。可以使用SOAPEnvelope、SOAPBody、SOAPHeader等类来构造和设置消息的内容。根据需要添加SOAP Header或SOAP Body中的元素,并设置相应的值。 6.通过生成的客户端类调用接口的方法,并将消息作为参数传递给方法。该方法将负责将请求发送到服务端,并等待响应。 7.接收服务端返回的响应消息。可以通过客户端类中提供的方法来获取响应的内容,如SOAP Body中的元素值。 8.根据需要对响应进行解析,提取所需的数据。可以使用XPath或其他解析技术来处理返回的SOAP消息。 9.最后,根据业务逻辑处理响应数据,并根据需要执行后续操作。 综上所述,使用Java远程调用SOAP协议接口可以通过生成客户端代码、构造SOAP消息、调用接口方法并处理返回结果实现。这样可以实现与服务端之间的远程通信和数据传输

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值