当前位置: 首页 > 知识库问答 >
问题:

如何用JAVA EE获取下载文件的HttpServletResponse实例

仲承福
2023-03-14

我在服务器上有一个文件txt(以前生成的)。当用户点击按钮它生成文件,现在我想(另外)下载文件在我的函数。但是我不能让它工作(我是JAVA EE新手),因为我不知道如何获得HttpServletResponse。

在web中,我用以下内容调用函数:

@Path("getreport")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public JSONObject getreport(CommonInput input) {
    JSONObject j = objectmapper.conertValue(reportBean.getreport(),JSONObject.class);
    return j;
}

reprotBean具有以下功能:

public void getreport() {
    //...doing many things
    //generating my file
    List<String> lines = new ArrayList<>();
    lines.add("star file");
    //..adding many lines
    Path file = Paths.get("C:\\Users\\myuser\\file.txt");
    Files.write(file, lines, StandardCharsets.UTF_8);

    downloadFile();
    //...doing many things
}

我找到了下载文件的方法:

public void downloadFile(HttpServletResponse response){ 
    String sourceFile = ""C:\\Users\\myuser\\file.txt"";
    try {
        FileInputStream inputStream = new FileInputStream(sourceFile);
        String disposition = "attachment; fileName=outputfile.txt";
        response.setContentType("text/txt");
        response.setHeader("Content-Disposition", disposition);
        response.setHeader("content-Length", String.valueOf(stream(inputStream, response.getOutputStream())));

    } catch (IOException e) {
        logger.error("Error occurred while downloading file {}",e);
    }
}

private long stream(InputStream input, OutputStream output) throws IOException {

try (ReadableByteChannel inputChannel = Channels.newChannel(input); WritableByteChannel outputChannel = Channels.newChannel(output)) {
    ByteBuffer buffer = ByteBuffer.allocate(10240);
    long size = 0;

    while (inputChannel.read(buffer) != -1) {
        buffer.flip();
        size += outputChannel.write(buffer);
        buffer.clear();
    }
    return size;
}
}

当我尝试使用downloadFile()时,它需要HttpServletResponse,而我没有那个参数。我不明白如何得到它(它是如何工作的),或者我必须使用另一种方法来下载我的文件?

我找到的所有解决方案都需要HttpServletResponse(从浏览器下载文件)

共有1个答案

暨宸
2023-03-14

如果您已经生成了该文件。只需将其写入HttpServletResponse

        resp.setContentType("text/plain");
        resp.setHeader("Content-disposition", "attachment; filename=sample.txt");

        try(InputStream in = req.getServletContext().getResourceAsStream("sample.txt");
          OutputStream out = resp.getOutputStream()) {

            byte[] buffer = new byte[ARBITARY_SIZE];

            int numBytesRead;
            while ((numBytesRead = in.read(buffer)) > 0) {
                out.write(buffer, 0, numBytesRead);
            }
        }

请确保您的文件可由ServeletContext访问

    @GetMapping("/download")
    public ResponseEntity<byte[]> downloadErrorData() throws Exception {
        List<Employee> employees = employeeService.getEmployees();
        ObjectMapper objectMapper = new ObjectMapper();
        String json = objectMapper.writeValueAsString(employees);
        byte[] isr = json.getBytes();
        String fileName = "employees.json";
        HttpHeaders respHeaders = new HttpHeaders();
        respHeaders.setContentLength(isr.length);
        respHeaders.setContentType(new MediaType("text", "json"));
        respHeaders.setCacheControl("must-revalidate, post-check=0, pre-check=0");
        respHeaders.set(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + fileName);
        return new ResponseEntity<byte[]>(isr, respHeaders, HttpStatus.OK);
    }
 类似资料:
  • 本文向大家介绍JavaEE实现文件下载,包括了JavaEE实现文件下载的使用技巧和注意事项,需要的朋友参考一下  我们先来看一个最简单的文件下载的例子:  该段代码的功能是从服务器端下载图片1.png。目录结构用MyEclipse的package explorer显示如下:   让我们增加一点难度,我们要下载的文件是一个中文名字的文件。由于在http协议中头文件中的东西只能是ASCII字符,因而通

  • 主要内容:1. ServletActionContext,2. ServletResponseAware,参考在Struts2中,可以用以下两种方式来获取HttpServletResponse对象。 1. ServletActionContext 通过 ServletActionContext 类来访问 HttpServletResponse 。 2. ServletResponseAware 通过实现 ServletResponseAware 接口并覆盖 setServletResponse(

  • cmf_get_file_download_url($file, $expires = 3600) 功能 获取文件下载链接 参数 $file: string 文件路径,数据库里保存的相对路径 $expires: int 过期时间,单位 s 返回 string 文件链接

  • X2.2.0新增 sp_get_file_download_url($file,$expires=3600) 功能: 获取文件下载链接 参数: $file: 数据库保存的文件路径 $expires:文件过期时间(七牛) 返回: 类型string,文件下载链接 使用: $url = sp_get_file_download_url('portal/23232.png');

  • 我是GWT和一般Web应用程序的新手。 我正在制作一个GWT web应用程序。它提供的一个功能是通过单击网页上的按钮下载文件。不幸的是,文件本身并不是物理上位于服务器端。服务器端需要通过对另一个web服务的REST调用来获取文件的InputStream。 我的问题是: 如何将流传递到客户端,以便浏览器可以开始下载? 在开始之前,我必须在服务器上物理写入文件吗? 非常感谢 编辑:我找到了这个例子:使

  • cmf_get_file_download_url($file, $expires = 3600) 功能 获取文件下载链接 参数 $file: string 文件路径,数据库里保存的相对路径 $expires: int 过期时间,单位 s 返回 string 文件链接