Spring Boot微服务间文件返回实现

 

Feign接口获取文件流问题_Java_wyazyf的博客-CSDN博客
https://blog.csdn.net/wyazyf/article/details/93200033

 

 

Spring Boot微服务间文件返回实现

 


下层服务返回文件流 (即文件下载)

@GetMapping(value = "/v1/files/**/{file_name:.+}")
    public void downFile(@PathVariable("file_name") String fileName, HttpServletResponse response, HttpServletRequest request) {
//        String uploadPath = IFlieServiceRpc.findByStrategyKey(uploadDir);
        String url = request.getServletPath();//获取url
        url = url.substring(url.lastIndexOf("files")).replace("files/", "");
        String uploadPath = null;
        String os = OSNameUtil.getOSname();
        if ("Windows".equals(os)) {
            uploadPath = winuploadDir;
        } else if ("Linux".equals(os)) {
            uploadPath = linuxuploadDir;
        }
        //截取时间戳
        String filename = "";//不带时间戳的文件名
        String ownFilePathString = "";//自定义文件路径
        if (url.lastIndexOf("/") > 0) {
            filename = url.substring(url.lastIndexOf("/") + 1);
            ownFilePathString = url.substring(0, url.lastIndexOf("/") + 1);
        } else {
            filename = url;
        }
        if (filename.indexOf("_") > 0) {
            filename = filename.substring(filename.indexOf("_") + 1);
        }
 
        String path = uploadPath + File.separator + url;
 
        String path1 = uploadPath + File.separator + ownFilePathString + filename;
 
        //判断文件是否存在
        File file2 = new File(path);
        if (!file2.exists()) {
            LOGGER.equals("文件不存在");
            throw new SBRException("文件不存在");
        }
        String getSm4Key = null;
        try {
            getSm4Key = PropertyUtil.getProperty("sm4");
            if (getSm4Key != null && !"".equals(getSm4Key)) {
                SM4Utils.decryptFile(path, path1, getSm4Key);
            } else {
                renameFile(path, path1);
                //path1=path;
            }
        } catch (IOException e1) {
            if (getSm4Key != null && !"".equals(getSm4Key)) {//解析后的文件需要删除
                File file = new File(path1);
                file.delete();
            }
            LOGGER.error("获取sm4报错,错误原因:" + e1);
            throw new SBRException("获取sm4报错,错误原因:" + e1);
        }
        File file = new File(path1);
        FileInputStream fis =null;
        try {
            if (file.exists()) {
                response.setHeader("Content-Disposition",
                        "attachment;filename=" + new String((file.getName()).getBytes("GB2312"), "ISO8859-1"));
                response.setContentLength((int) file.length());
                response.setContentType("application/octet-stream");// 定义输出类型
                fis = new FileInputStream(file);
                BufferedInputStream buff = new BufferedInputStream(fis);
                byte[] b = new byte[1024];// 相当于我们的缓存
                long k = 0;// 该值用于计算当前实际下载了多少字节
                OutputStream myout = response.getOutputStream();// 从response对象中得到输出流,准备下载
                // 开始循环下载
                while (k < file.length()) {
                    int j = buff.read(b, 0, 1024);
                    k += j;
                    myout.write(b, 0, j);
                }
                myout.flush();
                myout.close();
                buff.close();
                if (getSm4Key != null && !"".equals(getSm4Key)) {
                    file.delete();
                }
            }
        } catch (Exception e) {
            if (getSm4Key != null && !"".equals(getSm4Key)) {//解析后的文件需要删除
                file.delete();
            }
            LOGGER.error("文件下载流错误,错误原因:" + e);
            throw new SBRException("文件下载流错误,错误原因:" + e);
        } finally {
            if(fis!=null){
                try {
                    fis.close();
                    fis=null;
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            try {
                if (getSm4Key == null && "".equals(getSm4Key)) {//没加密的文件需要处理
                    renameFile(path1, path);
                }
            } catch (IOException e) {
                LOGGER.error("重命名失败,失败原因:" + e);
                throw new SBRException("重命名失败,失败原因:" + e);
            }
        }
    }

 

 

上下层服务间Feign接口调用

import feign.Response;

@FeignClient("prometheus-file")
public interface FileFeignClient {
 
    @GetMapping(value = "/file/api//v1/files/{file_name}",consumes = MediaType.APPLICATION_OCTET_STREAM_VALUE)
    Response downFile(@PathVariable("file_name") String fileName);
}

 

 

上层服务把下层服务的文件流返回给前端 (实现浏览器中文件下载)

    @GetMapping("/file/download")
    public void downloadProject(HttpServletResponse httpServletResponse)
        throws IOException {

        ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
        InputStream inputStream = feignBody.asInputStream();

        Response feignResponse = genAtomicFeign.downFile("file_name");
        Response.Body feignBody = feignResponse.body();

        feignResponse.headers().forEach((String key, Collection value) -> {
            httpServletResponse.setHeader(key, ((LinkedList) value).get(0));
        });

        byte[] c = new byte[1024];
        int length;
        while ((length = inputStream.read(c)) > 0) {
            servletOutputStream.write(c, 0, length);
        }

        servletOutputStream.flush();
        servletOutputStream.close();
    }

 

 

上层服务把下层服务的文件流保存为本地文件


/**
     * 将文件写入随机文件,并返回路径
     * @param fileName 文件名称
     * @return
     */
    public String  getFilePath(String fileName){
        InputStream inputStream = null;
        //获得文件流
        Response response =fileFeignClient.downFile(fileName);
        Response.Body body = response.body();
 
        String filePath ="";
        FileOutputStream fos = null;
        try {
            //获取response中的文件流
            inputStream = body.asInputStream();
//            byte[] b = new byte[inputStream.available()];
//            inputStream.read(b);
            //临时目录
            String folder=System.getProperty("java.io.tmpdir");
            int random = (int)(1+Math.random()*(10-1+1));
            String sj = String.valueOf(DateUtil.getCurrentDate().getTime());
            //临时路径+文件名称
            filePath = folder + sj+random+fileName.substring(fileName.lastIndexOf("."));
            //写入文件
            fos= new FileOutputStream(filePath);
            byte[] c = new byte[1024];
            int length;
            while((length= inputStream.read(c))>0){
                fos.write(c,0,length);
            }
 
        } catch (IOException e1) {
            e1.printStackTrace();
        }finally{
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return filePath;
    }

 

 

 

你可能感兴趣的:(spring)