需求背景:Java接入sonarqube进行代码检查,代码检查完成需要下载生成的PDF文件,下载入口是我们自己的平台,这就需要登录sonarqube文件流输出到前端直接下载pdf
代码如下,可直接运行记得帮忙点赞感谢:
浏览器下载PDF:
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
/**
@MethodName: toDownload
@Description: PDF下载
@Param: [response, sendPostParam]
@Return: void
@Author: gjq
@Date: 2023/5/31
**/
public static void toDownload(HttpServletResponse response, SendGetSonarParam sendPostParam ,String pdfName) {
ServletOutputStream out = null;
InputStream inputStream = null;
try {
// 获取外部文件流
log.info("下载中------invPdfUrl=" + sendPostParam.getUrl());
URL url = new URL(sendPostParam.getUrl());
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty(AUTHORIZATION, HttpClinetSonarConfig.getHttpClinetSonarConfig().getHeader());
conn.setConnectTimeout(3 * 1000);
//防止屏蔽程序抓取而返回403错误
conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
inputStream = conn.getInputStream();
/**
* 输出文件到浏览器
*/
int len = 0;
// 输出 下载的响应头,如果下载的文件是中文名,文件名需要经过url编码
response.setContentType("text/html;charset=utf-8");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(pdfName.concat(".pdf"), "UTF-8"));
response.setHeader("Cache-Control", "no-cache");
out = response.getOutputStream();
byte[] buffer = new byte[1024];
while ((len = inputStream.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
out.flush();
log.info("pdf文件下载完成.....");
} catch (Exception e) {
log.error("pdf文件下载异常,e = {}", e);
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (Exception e) {
}
}
if (out != null) {
try {
out.close();
} catch (Exception e) {
}
}
}
}
HttpClinetSonarConfig类
@Component
@Slf4j
public class HttpClinetSonarConfig implements InitializingBean {
private static HttpClinetSonarConfig httpClinetSonarConfig = null;
public static HttpClinetSonarConfig getHttpClinetSonarConfig() {
return httpClinetSonarConfig;
}
private final String BASIC = "Basic ";
/**
* sonar地址信息
*/
@Value("${sonar.connect.url}")//在properties配置对应的参数即可
public String sonarUrl;
/**
* 登录密码
*/
@Value("${sonar.connect.password}")
public String sonarPassWord;
/**
* 用户名信息
*/
@Value("${sonar.connect.username}")
public String sonarUserName;
/**
* 用户名信息
*/
@Value("${sonar.pdf.download}")
public String downloadPDF;
@Override
public void afterPropertiesSet() throws Exception {
httpClinetSonarConfig = this;
log.info("HttpClinetConfig:{}", this);
}
/**
* 构造Basic Auth认证头信息
*/
public String getHeader() {
String auth = sonarUserName.concat(":").concat(sonarPassWord);
byte[] encodedAuth = Base64.encodeBase64(auth.getBytes(Charset.forName("US-ASCII")));
String authHeader = BASIC.concat(new String(encodedAuth));
return authHeader;
}
@Override
public String toString() {
return JSON.toJSONString(this);
}
}
SendGetSonarParam类,主要是URL地址,这里做了一个封装方便其他人使用
@Data
public class SendGetSonarParam extends BaseObject {
/**
* 请求URL
*/
private String url;
/**
* 请求参数
*/
private Map<String, String> param;
/**
* 请求headers
*/
private Map<String, String> headers;
/**
* requestConfig
*/
private RequestConfig requestConfig;
}