SpringCloud OpenFeign 流式响应文件
#流式传输#分块传输#Feign#OpenFeign
@FeignClient代码
java
import cn.hutool.json.JSONObject;
import feign.Response;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@FeignClient(name = "documentConver", url = "http://127.0.0.1:15676")
public interface DocumentConverClient {
@PostMapping("/html2pdf/url")
Response html2pdfUrl(@RequestBody JSONObject jsonObject);
}Controller转化Feign流式响应文件
java
package com.ruoyi.web.controller.oa;
import cn.hutool.core.codec.Base64;
import cn.hutool.json.JSONUtil;
import com.ruoyi.common.rpc.htm2pdf.DocumentConverClient;
import feign.Response;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
@RestController
@RequestMapping("/test")
@RequiredArgsConstructor
@Slf4j
public class TestController {
private final DocumentConverClient documentConverClient;
@GetMapping("/url_to_pdf")
public void urlToPdf(String url, HttpServletResponse response) {
String decodeUrl = "";
try {
decodeUrl = Base64.decodeStr(url, StandardCharsets.UTF_8);
// 获取Feign响应对象
try (Response feignResponse = documentConverClient.htmlUrl2Pdf(JSONUtil.createObj().set("url","https://www.baidu.com"))) {
// 检查响应状态
if (feignResponse.status() != 200) {
throw new RuntimeException("PDF服务返回错误状态: " + feignResponse.status());
}
// 可选:复制原始响应头
feignResponse.headers().forEach((key, values) -> {
if (key != null && values != null && !key.equalsIgnoreCase("Transfer-Encoding")) {
values.forEach(value -> response.addHeader(key, value));
}
});
// 设置响应头
response.setContentType("application/pdf");
response.setCharacterEncoding("UTF-8");
// 流式传输
try (InputStream inputStream = feignResponse.body().asInputStream();
OutputStream outputStream = response.getOutputStream()) {
byte[] buffer = new byte[8192];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
}
}
} catch (Exception e) {
log.error("查看pdf失败 url={} decodeUrl={}", url, decodeUrl, e);
throw new RuntimeException("查看pdf失败: " + e.getMessage());
}
}
}