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

该文章描述了一个JavaSpringMVC接口如何处理文件下载。首先,调用方接口通过文件名获取文件的byte数组,然后设置响应头并返回给前端。如果文件不在本地,它会远程调用其他服务的接口获取文件,并可能将文件备份到本地。被调用方的远程接口负责提供文件的byte数组。
摘要由CSDN通过智能技术生成

  • 通过文件名,获取文件
  • 远程调用接口拿到文件的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");
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值