小叫给 2023-03-23 15:29 采纳率: 0%
浏览 116
已结题

response.outputStream乱码且输出不正确,求大神教一下


//批量下载文件并打包
    public static void downLoadZipAllFile(HttpServletRequest request, HttpServletResponse response, List<Map<String,String>> maps) {
        OutputStream outp = null;
        ZipOutputStream zos = null;
        BufferedInputStream bis = null;
        String downloadZipDir = "D:/ftpHome/downloadZip";
        try {
            outp = response.getOutputStream();
            response.setCharacterEncoding("UTF-8");
            response.setContentType("text/html; charset=UTF-8"); //设置编码字符
            response.setContentType("application/octet-stream"); //设置内容类型为下载类型
//            response.setContentType("application/zip");// 定义输出类型
            String timeSuffix = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
            String zipFilePath = downloadZipDir + "/" + timeSuffix + "_DataFile.zip";
            String filedisplay = zipFilePath;
            if (filedisplay.indexOf("/") >= 0) {
                filedisplay = filedisplay.substring(filedisplay.lastIndexOf("/") + 1);
            } else if (filedisplay.indexOf("\\") >= 0) {
                filedisplay = filedisplay.substring(filedisplay.lastIndexOf("\\") + 1);
            }
            String agent = (String) request.getHeader("USER-AGENT");
            // firefox
            if (agent != null && agent.indexOf("MSIE") == -1) {
                String enableFileName = "=?UTF-8?B?"
                        + (new String(Base64.getBase64(filedisplay))) + "?=";
                response.setHeader("Content-Disposition",
                        "attachment; filename=" + enableFileName);
            } else {
                filedisplay = URLEncoder.encode(filedisplay, "utf-8");
                response.addHeader("Content-Disposition",
                        "attachment;filename=" + filedisplay);
            }
            try {
//                File zip = new File(zipFilePath);
//                if (!zip.exists()) {
//                    zip.createNewFile();
//                }
                zos = new ZipOutputStream(new FileOutputStream(zipFilePath));
                for (Map<String, String> map : maps) {
                    String filePath = map.get("filePath");
                    String filename = map.get("fileName");
                    File file = new File(filePath);
                    if (file.exists()) {
                        zos.putNextEntry(new ZipEntry(filename));
                        zos.setEncoding("GBK");
                        bis = new BufferedInputStream(new FileInputStream(file));
                        byte[] b = new byte[1024 * 64];
                        int i = 0;
                        while ((i = bis.read(b)) > 0) {
                            zos.write(b, 0, i);
                        }
                        zos.closeEntry();
                        bis.close();
                        String isDelete = request.getParameter("isDelete");
                        if ("1".equals(isDelete)) {
                            file.delete();
                        }
                    }
//                    else {
//                        outp.write("文件不存在!".getBytes("GBK"));
//                    }
                }
                zos.close();
                InputStream ins = new FileInputStream(zipFilePath);
                BufferedInputStream bins = new BufferedInputStream(ins);// 放到缓冲流里面
                BufferedOutputStream bouts = new BufferedOutputStream(outp);
                int bytesRead = 0;
                byte[] buffer = new byte[8192];
                // 开始向网络传输文件流
                while ((bytesRead = bins.read(buffer, 0, 8192)) != -1) {
                    bouts.write(buffer, 0, bytesRead);
                }
                bouts.flush();// 这里一定要调用flush()方法
                ins.close();
                bins.close();
                outp.close();
                bouts.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
//            finally {
//                if (bis != null) {
//                    bis.close();
//                    bis = null;
//                }
////                if (zos != null) {
////                    zos.close();
////                    zos = null;
////                }
////                if (outp != null) {
////                    outp.close();
////                    outp = null;
////                }
//            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

目前的效果是能在文件夹中看到压缩好的包,但是把这个zip包通过流的方式发送到浏览器,也就是利用response.getOutputStream,为啥弹出来的不是zip包,而是其中一个文件,并且文件中乱码,求各位大神教教呀!

img

img

img

谷歌浏览器乱码情况如下:

img

  • 写回答

7条回答 默认 最新

  • 「已注销」 2023-03-23 15:41
    关注

    参考GPT:可能是因为你在设置response的ContentType时,同时设置了"text/html; charset=UTF-8"和"application/octet-stream"两种类型,导致输出的内容既不是html文本,也不是二进制流类型,而是一些混合的内容,从而导致浏览器无法正确处理文件类型。

    你可以尝试修改代码,只保留设置"application/octet-stream"的内容类型,并删除设置"text/html; charset=UTF-8"的代码行。另外,也可以将写入Zip文件的编码方式设置为UTF-8,这样可以确保文件内容的正确性。下面是修改后的代码片段:

    outp = response.getOutputStream();
    response.setContentType("application/octet-stream");
    String timeSuffix = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
    String zipFilePath = downloadZipDir + "/" + timeSuffix + "_DataFile.zip";
    String filedisplay = zipFilePath;
    if (filedisplay.indexOf("/") >= 0) {
        filedisplay = filedisplay.substring(filedisplay.lastIndexOf("/") + 1);
    } else if (filedisplay.indexOf("\\") >= 0) {
        filedisplay = filedisplay.substring(filedisplay.lastIndexOf("\\") + 1);
    }
    String agent = (String) request.getHeader("USER-AGENT");
    if (agent != null && agent.indexOf("MSIE") == -1) {
        String enableFileName = "=?UTF-8?B?" + (new String(Base64.getBase64(filedisplay))) + "?=";
        response.setHeader("Content-Disposition", "attachment; filename=" + enableFileName);
    } else {
        filedisplay = URLEncoder.encode(filedisplay, "utf-8");
        response.addHeader("Content-Disposition", "attachment;filename=" + filedisplay);
    }
    try {
        zos = new ZipOutputStream(new FileOutputStream(zipFilePath), Charset.forName("UTF-8"));
        for (Map<String, String> map : maps) {
            String filePath = map.get("filePath");
            String filename = map.get("fileName");
            File file = new File(filePath);
            if (file.exists()) {
                zos.putNextEntry(new ZipEntry(filename));
                bis = new BufferedInputStream(new FileInputStream(file));
                byte[] b = new byte[1024 * 64];
                int i = 0;
                while ((i = bis.read(b)) > 0) {
                    zos.write(b, 0, i);
                }
                zos.closeEntry();
                bis.close();
                String isDelete = request.getParameter("isDelete");
                if ("1".equals(isDelete)) {
                    file.delete();
                }
            }
        }
        zos.close();
        InputStream ins = new FileInputStream(zipFilePath);
        BufferedInputStream bins = new BufferedInputStream(ins);
        BufferedOutputStream bouts = new BufferedOutputStream(outp);
        int bytesRead = 0;
        byte[] buffer = new byte[8192];
        while ((bytesRead = bins.read(buffer, 0, 8192)) != -1) {
            bouts.write(buffer, 0, bytesRead);
        }
        bouts.flush();
        ins.close();
        bins.close();
        outp.close();
        bouts.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    
    
    
    评论

报告相同问题?

问题事件

  • 系统已结题 3月31日
  • 修改了问题 3月24日
  • 修改了问题 3月23日
  • 创建了问题 3月23日