java - 通过REST接口(interface)以可下载文件的形式返回进程的输出和错误流

标签 java spring-boot

创建执行流程的REST端点并将其stdout + stderr输出作为可下载文件提供的便捷方法是什么?

最佳答案

这是我最终使用的内容:

public ResponseEntity<StreamingResponseBody> example() throws IOException {
    Process p = new ProcessBuilder(/*...*/).redirectErrorStream(true).start();

    //better to use a static executor, but here I'm creating a new one every time
    Executors.newSingleThreadScheduledExecutor().schedule(() -> {
        if (p != null && p.isAlive()) {
            p.destroyForcibly(); //Destroy the process after a timeout period if it's still running
        }
    }, 10, TimeUnit.SECONDS);

    //No need to read err stream separately, it's redirected to stdout due to "redirectErrorStream"
    InputStream inputStream = p.getInputStream(); 

    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
    response.setHeader("Content-Disposition", "attachment; filename=foo.gz");

    return new ResponseEntity<>(new StreamingResponseBody() {
        @Override
        public void writeTo(OutputStream outputStream) throws IOException {
            try (GZIPOutputStream gzOut = new GZIPOutputStream(outputStream)) {
                while (p.isAlive()) {
                    inputStream.transferTo(gzOut);
                    gzOut.flush();
                }
            }
        }
    }, headers, HttpStatus.OK);
}

关于java - 通过REST接口(interface)以可下载文件的形式返回进程的输出和错误流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60801477/

相关文章:

java - 使用 Spring Boot 和并行流发送电子邮件

java - spring.resources.static-locations 不适用于 devtools

java - Spring Boot 找不到特定于配置文件的属性文件

java - 在不加载 Spring 上下文的情况下测试 @ConfigurationProperties 注释

mysql - Hibernate Spring Boot中如何实现IS-A关系?

java - 倒计时器的 EditText 值

java - 使用 iText7 在现有 PDF 的特定页面中添加表格

java - 语法错误, 'for each' 语句仅在源级别为 1.5 或更高时可用

java - 如何使用Hibernate多对多将jsp页面中多个select标签的数据保存到数据库

java - 查找并比较字符串中各个单词的长度