@Slf4j
public class HttpClientUtil {
private static PoolingHttpClientConnectionManager cm;
private static String EMPTY_STR = “”;
private static String UTF_8 = “UTF-8”;
private static void init() {
if (cm == null) {
cm = new PoolingHttpClientConnectionManager();
cm.setMaxTotal(50);// 整个连接池最大连接数
cm.setDefaultMaxPerRoute(5);// 每路由最大连接数,默认值是2
}
}
/**
* 通过连接池获取HttpClient
*
* @return
*/
private static CloseableHttpClient getHttpClient() {
init();
return HttpClients.custom().setConnectionManager(cm).build();
}
/**
* 中转文件 上传本地文件到oss
* @param remoteUrl 第三方接口地址
* @param fileUrl 上传的文件本地地址
* @return 响应结果
*/
@SuppressWarnings("Duplicates")
public static String uploadFile(String remoteUrl, String fileUrl) {
CloseableHttpClient httpClient = HttpClients.createDefault();
String result = null;
HttpPost httpPost = null;
try {
File file = new File(fileUrl);
InputStream is = new FileInputStream(file);
String fileName = file.getName();
httpPost = new HttpPost(remoteUrl);
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.addBinaryBody("file", is, ContentType.MULTIPART_FORM_DATA, fileName);// 文件流
builder.setCharset(Charset.forName("utf-8"));
HttpEntity entity = builder.build();
httpPost.setEntity(entity);
HttpResponse response = httpClient.execute(httpPost);// 执行提交
HttpEntity responseEntity = response.getEntity();
if (responseEntity != null) {
// 将响应内容转换为字符串
result = EntityUtils.toString(responseEntity, Charset.forName("UTF-8"));
System.out.println(result);
JSONObject jsonObject = JSON.parseObject(result);
String success = jsonObject.get("success").toString();
if ("true".equals(success)){
//这里的值根据返回值动态获取
result = jsonObject.get("serverFileID").toString();
}
}
} catch (IOException e) {
log.error(e.getMessage(),e);
} catch (Exception e) {
log.error(e.getMessage(),e);
} finally {
if (httpPost != null){
httpPost.releaseConnection();
}
try {
httpClient.close();
} catch (IOException e) {
log.error(e.getMessage(),e);
}
}
return result;
}
/**
* 中转文件
* @param remoteUrl 第三方接口地址
* @param file 上传的文件
* @return 响应结果
*/
@SuppressWarnings("Duplicates")
public static String uploadFile(String remoteUrl, MultipartFile file) {
CloseableHttpClient httpClient = HttpClients.createDefault();
String result = null;
HttpPost httpPost = null;
try {
String fileName = file.getOriginalFilename();
httpPost = new HttpPost(remoteUrl);
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.addBinaryBody("file", file.getInputStream(), ContentType.MULTIPART_FORM_DATA, fileName);// 文件流
builder.setCharset(Charset.forName("utf-8"));
HttpEntity entity = builder.build();
httpPost.setEntity(entity);
HttpResponse response = httpClient.execute(httpPost);// 执行提交
HttpEntity responseEntity = response.getEntity();
if (responseEntity != null) {
// 将响应内容转换为字符串
result = EntityUtils.toString(responseEntity, Charset.forName("UTF-8"));
System.out.println(result);
JSONObject jsonObject = JSON.parseObject(result);
String success = jsonObject.get("success").toString();
if ("true".equals(success)){
//这里的返回值根据返回值动态获取
result = jsonObject.get("serverFileID").toString();
}
}
} catch (IOException e) {
log.error(e.getMessage(),e);
} catch (Exception e) {
log.error(e.getMessage(),e);
} finally {
if (httpPost != null){
httpPost.releaseConnection();
}
try {
httpClient.close();
} catch (IOException e) {
log.error(e.getMessage(),e);
}
}
return result;
}
/**
* 下载文件到本地
* @param url 第三方接口地址
* @param fileId 文件key
* @param fileUrlName 下载到本地的路径+文件名
*/
public static void download(String url,String fileId,String fileUrlName){
InputStream is = null;
HttpGet httpGet = null;
FileOutputStream downloadFile = null;
try {
OssFileBean ossFileBean= getOssFileBean(url, fileId);
httpGet = ossFileBean.getHttpGet();
is = ossFileBean.getInputStream();
int index;
byte[] bytes = new byte[1024];
downloadFile = new FileOutputStream(fileUrlName);
while ((index = is.read(bytes)) != -1) {
downloadFile.write(bytes, 0, index);
downloadFile.flush();
}
} catch (Exception e) {
log.error(e.getMessage(),e);
} finally {
if (downloadFile != null){
try {
downloadFile.close();
} catch (IOException e) {
}
}
if (is != null){
try {
is.close();
} catch (IOException e) {
}
}
if (httpGet != null){
try {
httpGet.releaseConnection();
} catch (Exception e) {
}
}
}
}
/**
* 获取文件流对象及连接对象
* @param url
* @param fileId
* @return OssFileBean
*/
public static OssFileBean getOssFileBean(String url, String fileId) {
OssFileBean ossFileBean = new OssFileBean();
url += fileId;
// 请求结果
// 创建client
CloseableHttpClient client = HttpClients.createDefault();
// 创建HttpGet
HttpGet httpGet = new HttpGet();
try {
// 创建uri
URIBuilder builder = new URIBuilder(url);
URI uri = builder.build();
// 设置请求地址
httpGet.setURI(uri);
// 发送请求,返回响应对象
CloseableHttpResponse response = client.execute(httpGet);
// 获取响应状态
int status = response.getStatusLine().getStatusCode();
if (status == HttpStatus.SC_OK) {
// 获取响应数据
HttpEntity entity = response.getEntity();
InputStream in = entity.getContent();
Header[] allHeaders = response.getAllHeaders();
for (Header allHeader : allHeaders) {
if ("Content-Disposition".equalsIgnoreCase(allHeader.getName())) {
String value = allHeader.getValue();
if (value.contains("downloadFile.")){
value = value.substring(value.indexOf("downloadFile.")+"downloadFile.".length(),value.length()-1);
}else if (value.contains("filename=")){
value = value.substring(value.indexOf("filename=")+"filename=".length(),value.length()-1);
}
ossFileBean.setFileName(value);
}
}
ossFileBean.setHttpGet(httpGet);
ossFileBean.setInputStream(in);
}else {
return null;
}
}catch (IOException e) {
log.error(e.getMessage(),e);
} catch (Exception e) {
log.error(e.getMessage(),e);
}
return ossFileBean;
}
@Data
public static class OssFileBean {
//文件流
private InputStream inputStream;
//返回连接 记得要关闭
private HttpGet httpGet;
//文件名
private String fileName;
}
}