Java 백엔드는 파일 스트림을 프런트엔드로 반환하여 다운로드 기능을 구현합니다!

프론트 엔드에서 파일 다운로드 기능을 구현하는 방법은 여러 가지가 있지만 여기서는 하나씩 소개하지 않고 파일 스트림 다운로드를 사용하는 구현 방법만 소개합니다.

파일 스트림이기 때문에 반드시 프런트엔드에 한 묶음의 바이너리 코드를 반환해야 합니다. 백엔드에서는OutPutStream

백엔드는 Java에서 제공하는 서블릿을 사용할 수 있으며 HttpServletResponse, 핵심 단계는 응답의 데이터 유형을 설정하고 이를 특정 파일 유형 또는 바이너리 형식과 응답 헤더로 설정한 후 ServletOutputStream파일을 프론트엔드로 보내는 것 입니다. 스트림의 형태.

코드를 직접 업로드하세요.

response.setCharacterEncoding("UTF-8");
response.setContentType("application/vnd.ms-excel");

response.setHeader("Content-Disposition", "attachment;filename=example.xls");

설명하다

  1. 먼저 응답 데이터 유형을 설정합니다. 다운로드하려는 파일 유형을 설정합니다. 파일이 어떤 유형인지는 모르지만 텍스트 파일이 아니라고 확신하는 경우 브라우저가 알 수 있도록 다음 표현을 사용합니다. 이는 바이너리 데이터이므로 application/octet-stream구문 분석되지 않습니다.

  2. 다음은 응답 헤더를 설정하는 것입니다.

attachment: 응답 콘텐츠가 첨부 파일로 처리되어야 하며 브라우저 다운로드 동작이 트리거됨을 나타냅니다.

filename: 매개변수는 다운로드된 파일의 이름을 지정합니다. 위 코드를 사용하면 브라우저가 example.xls 파일을 다운로드하게 됩니다.

다음은 일반적인 MIME 유형과 아래 그림, png 유형, pdf, ppt 등과 같은 일반적인 MIME 유형 목록이 포함된 링크입니다.

그런 다음 스트림 형태로 프런트 엔드로 전송됩니다.

ServletOutputStream outputStream = response.getOutputStream();
checkInfo.write(outputStream);
outputStream.flush();

이러한 방식으로 백엔드는 파일 스트림 형식으로 파일을 프런트엔드에 전달하는 것을 완료하고 프런트엔드에서 시작된 요청은 브라우저의 다운로드 동작을 트리거합니다.

아래는 전체 코드입니다.

@GetMapping("/output/{classId}/{checkName}")
    public void checkToExcel(@PathVariable String checkName, @PathVariable String classId, HttpServletResponse response) {
        HSSFWorkbook checkInfo = checkExcelService.getCheckInfo(classId, checkName);
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("UTF-8");
        response.setHeader("Content-Disposition", "attachment;filename=" + checkName + "签到统计表.xls");
        try {
            ServletOutputStream outputStream = response.getOutputStream();
            checkInfo.write(outputStream);
            outputStream.flush();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

저 같은 친구가 있을지 모르겠네요. 메소드의 반환 값이 스트림으로 작성됩니다(예: ByteArrayOutputStream). 이것은 잘못된 것입니다.

이전에 이 프로그램을 작성할 때 프런트 엔드에 스트림을 반환했는데 그 결과 다운로드한 파일이 항상 잘못된 형식이었고 브라우저에서 수신한 응답 데이터 유형이 항상 json이었습니다. 스트림을 보내는 데 사용되지 않으므로 스트림을 얻은 response.getOutputStream()다음 플러시하는 데 사용해야 합니다 . 그러면 프런트 엔드가 실제로 바이너리 파일 스트림을 수신합니다.

추천

출처blog.csdn.net/weixin_54542328/article/details/132568019