多学学习吧 2023-01-16 20:54 采纳率: 0%
浏览 529

java下载文件文件内容为空

java下载文件接口输出文件内容为空
如果不用javaresponse.getOutpuStream,而是new一个FileOutputStream,写死为本地路径,那么输出的文件可以正常查看,一点问题没有。可是下面的代码下载的文件,如果是图片,查看的时候提示不支持,pdf格式有页数,内容是空白的,文本格式也是空白的。换过ContentType也没解决,也试过直接write读回来的字节数组也没用。并且控制台并没有报错。希望各位朋友能够指点一二,不胜感激
public void downloadAnnexFile(String annexId, HttpServletRequest request, HttpServletResponse response){
        logger.info("进入service");
        RDDataAnnexBO annexInfo = rdDataAnnexDao.selectAnnexInfoById(annexId);
        logger.info("附件对象:" + annexInfo.toString());
        if(annexInfo == null){
            return;
        }
        //文件名转义回原文展示给用户下载
        String fileName = unescapeHtml4ByString(annexInfo.getFileName());
        logger.info("转义回原文的文件名:" + fileName);
        ByteArrayInputStream byteArrayInputStream = null;
        String downloadFileName = "";
        OutputStream outputStream = null;
        try {
            response.setContentType("application/octet-stream");
            String userAgent = request.getHeader("User-Agent");
            boolean isMSIE = ((userAgent != null && userAgent.contains("MSIE")) ||
                    (null != userAgent && (userAgent.contains("like Gecko") && !userAgent.contains("Safari"))) ||
                    (userAgent != null && userAgent.contains("Edge")));
            if (isMSIE) {
                downloadFileName = URLEncoder.encode(fileName + annexInfo.getFileSuffix(), "UTF-8");
            } else {
                downloadFileName = new String((fileName + annexInfo.getFileSuffix()).getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1);
            }
            response.setHeader("Content-disposition", String.format("attachment; filename=\"%s\"", downloadFileName));
            byte[] base = hdfsBucketDubboService.readStreamFileToHdfs(annexInfo.getAnnex(), "/BLM/RD");
            byteArrayInputStream = new ByteArrayInputStream(base);
            outputStream = response.getOutputStream();
            byte[] content = new byte[1024];
            int length = 0;
            while ((length = byteArrayInputStream.read(content)) != -1) {
                outputStream.write(content, 0, length);
            }
        } catch (Exception e) {
            logger.error("下载HDFS文件异常", e);
        } finally {
            try {
                if (outputStream != null) {
                    outputStream.flush();
                    outputStream.close();
                }
                if (byteArrayInputStream != null) {
                    byteArrayInputStream.close();
                }
            } catch (Exception e) {
                logger.error("流关闭异常:", e);
            }
        }
        logger.info("service完成");
    }

  • 写回答

3条回答 默认 最新

  • Halifax ‎ 2023-01-16 21:49
    关注

    望采纳!!!

    先调用 byteArrayInputstream 的 close,然后再调用 outputstream 的 flush 和 close 方法。。

    评论

报告相同问题?

问题事件

  • 请详细说明问题背景 10月14日
  • 创建了问题 1月16日

悬赏问题

  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化
  • ¥15 Mirare PLUS 进行密钥认证?(详解)
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥20 想用ollama做一个自己的AI数据库
  • ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
  • ¥15 请问怎么才能复现这样的图呀