| @@ -0,0 +1,88 @@ | |||||
| package me.chanjar.weixin.common.util.http; | |||||
| import jodd.http.HttpResponse; | |||||
| import me.chanjar.weixin.common.bean.result.WxError; | |||||
| import me.chanjar.weixin.common.exception.WxErrorException; | |||||
| import okhttp3.Response; | |||||
| import org.apache.http.Header; | |||||
| import org.apache.http.client.methods.CloseableHttpResponse; | |||||
| import java.util.regex.Matcher; | |||||
| import java.util.regex.Pattern; | |||||
| /** | |||||
| * <pre> | |||||
| * 三种http框架的response代理类,方便提取公共方法 | |||||
| * Created by Binary Wang on 2017-8-3. | |||||
| * </pre> | |||||
| * | |||||
| * @author <a href="https://github.com/binarywang">Binary Wang</a> | |||||
| */ | |||||
| public class HttpResponseProxy { | |||||
| private CloseableHttpResponse apacheHttpResponse; | |||||
| private HttpResponse joddHttpResponse; | |||||
| private Response okHttpResponse; | |||||
| public HttpResponseProxy(CloseableHttpResponse apacheHttpResponse) { | |||||
| this.apacheHttpResponse = apacheHttpResponse; | |||||
| } | |||||
| public HttpResponseProxy(HttpResponse joddHttpResponse) { | |||||
| this.joddHttpResponse = joddHttpResponse; | |||||
| } | |||||
| public HttpResponseProxy(Response okHttpResponse) { | |||||
| this.okHttpResponse = okHttpResponse; | |||||
| } | |||||
| public String getFileName() throws WxErrorException { | |||||
| //由于对象只能由一个构造方法实现,因此三个response对象必定且只有一个不为空 | |||||
| if (this.apacheHttpResponse != null) { | |||||
| return this.getFileName(this.apacheHttpResponse); | |||||
| } | |||||
| if (this.joddHttpResponse != null) { | |||||
| return this.getFileName(this.joddHttpResponse); | |||||
| } | |||||
| if (this.okHttpResponse != null) { | |||||
| return this.getFileName(this.okHttpResponse); | |||||
| } | |||||
| //cannot happen | |||||
| return null; | |||||
| } | |||||
| private String getFileName(CloseableHttpResponse response) throws WxErrorException { | |||||
| Header[] contentDispositionHeader = response.getHeaders("Content-disposition"); | |||||
| if (contentDispositionHeader == null || contentDispositionHeader.length == 0) { | |||||
| throw new WxErrorException(WxError.newBuilder().setErrorMsg("无法获取到文件名").build()); | |||||
| } | |||||
| return this.extractFileNameFromContentString(contentDispositionHeader[0].getValue()); | |||||
| } | |||||
| private String getFileName(HttpResponse response) throws WxErrorException { | |||||
| String content = response.header("Content-disposition"); | |||||
| return this.extractFileNameFromContentString(content); | |||||
| } | |||||
| private String getFileName(Response response) throws WxErrorException { | |||||
| String content = response.header("Content-disposition"); | |||||
| return this.extractFileNameFromContentString(content); | |||||
| } | |||||
| private String extractFileNameFromContentString(String content) throws WxErrorException { | |||||
| if (content == null || content.length() == 0) { | |||||
| throw new WxErrorException(WxError.newBuilder().setErrorMsg("无法获取到文件名").build()); | |||||
| } | |||||
| Pattern p = Pattern.compile(".*filename=\"(.*)\""); | |||||
| Matcher m = p.matcher(content); | |||||
| if (m.matches()) { | |||||
| return m.group(1); | |||||
| } | |||||
| throw new WxErrorException(WxError.newBuilder().setErrorMsg("无法获取到文件名").build()); | |||||
| } | |||||
| } | |||||
| @@ -3,8 +3,10 @@ package me.chanjar.weixin.common.util.http.apache; | |||||
| import me.chanjar.weixin.common.bean.result.WxError; | import me.chanjar.weixin.common.bean.result.WxError; | ||||
| import me.chanjar.weixin.common.exception.WxErrorException; | import me.chanjar.weixin.common.exception.WxErrorException; | ||||
| import me.chanjar.weixin.common.util.fs.FileUtils; | import me.chanjar.weixin.common.util.fs.FileUtils; | ||||
| import me.chanjar.weixin.common.util.http.HttpResponseProxy; | |||||
| import me.chanjar.weixin.common.util.http.MediaDownloadRequestExecutor; | import me.chanjar.weixin.common.util.http.MediaDownloadRequestExecutor; | ||||
| import me.chanjar.weixin.common.util.http.RequestHttp; | import me.chanjar.weixin.common.util.http.RequestHttp; | ||||
| import org.apache.commons.io.FilenameUtils; | |||||
| import org.apache.commons.lang3.StringUtils; | import org.apache.commons.lang3.StringUtils; | ||||
| import org.apache.http.Header; | import org.apache.http.Header; | ||||
| import org.apache.http.HttpHost; | import org.apache.http.HttpHost; | ||||
| @@ -17,15 +19,12 @@ import org.apache.http.impl.client.CloseableHttpClient; | |||||
| import java.io.File; | import java.io.File; | ||||
| import java.io.IOException; | import java.io.IOException; | ||||
| import java.io.InputStream; | import java.io.InputStream; | ||||
| import java.util.regex.Matcher; | |||||
| import java.util.regex.Pattern; | |||||
| /** | /** | ||||
| * Created by ecoolper on 2017/5/5. | * Created by ecoolper on 2017/5/5. | ||||
| */ | */ | ||||
| public class ApacheMediaDownloadRequestExecutor extends MediaDownloadRequestExecutor<CloseableHttpClient, HttpHost> { | public class ApacheMediaDownloadRequestExecutor extends MediaDownloadRequestExecutor<CloseableHttpClient, HttpHost> { | ||||
| public ApacheMediaDownloadRequestExecutor(RequestHttp requestHttp, File tmpDirFile) { | public ApacheMediaDownloadRequestExecutor(RequestHttp requestHttp, File tmpDirFile) { | ||||
| super(requestHttp, tmpDirFile); | super(requestHttp, tmpDirFile); | ||||
| } | } | ||||
| @@ -57,31 +56,17 @@ public class ApacheMediaDownloadRequestExecutor extends MediaDownloadRequestExec | |||||
| } | } | ||||
| } | } | ||||
| String fileName = getFileName(response); | |||||
| String fileName = new HttpResponseProxy(response).getFileName(); | |||||
| if (StringUtils.isBlank(fileName)) { | if (StringUtils.isBlank(fileName)) { | ||||
| return null; | return null; | ||||
| } | } | ||||
| String[] nameAndExt = fileName.split("\\."); | |||||
| return FileUtils.createTmpFile(inputStream, nameAndExt[0], nameAndExt[1], super.tmpDirFile); | |||||
| return FileUtils.createTmpFile(inputStream, FilenameUtils.getBaseName(fileName), FilenameUtils.getExtension(fileName), | |||||
| super.tmpDirFile); | |||||
| } finally { | } finally { | ||||
| httpGet.releaseConnection(); | httpGet.releaseConnection(); | ||||
| } | } | ||||
| } | } | ||||
| private String getFileName(CloseableHttpResponse response) throws WxErrorException { | |||||
| Header[] contentDispositionHeader = response.getHeaders("Content-disposition"); | |||||
| if (contentDispositionHeader == null || contentDispositionHeader.length == 0) { | |||||
| throw new WxErrorException(WxError.newBuilder().setErrorMsg("无法获取到文件名").build()); | |||||
| } | |||||
| Pattern p = Pattern.compile(".*filename=\"(.*)\""); | |||||
| Matcher m = p.matcher(contentDispositionHeader[0].getValue()); | |||||
| if (m.matches()) { | |||||
| return m.group(1); | |||||
| } | |||||
| throw new WxErrorException(WxError.newBuilder().setErrorMsg("无法获取到文件名").build()); | |||||
| } | |||||
| } | } | ||||
| @@ -5,27 +5,25 @@ import jodd.http.HttpRequest; | |||||
| import jodd.http.HttpResponse; | import jodd.http.HttpResponse; | ||||
| import jodd.http.ProxyInfo; | import jodd.http.ProxyInfo; | ||||
| import jodd.util.StringPool; | import jodd.util.StringPool; | ||||
| import me.chanjar.weixin.common.bean.result.WxError; | import me.chanjar.weixin.common.bean.result.WxError; | ||||
| import me.chanjar.weixin.common.exception.WxErrorException; | import me.chanjar.weixin.common.exception.WxErrorException; | ||||
| import me.chanjar.weixin.common.util.fs.FileUtils; | import me.chanjar.weixin.common.util.fs.FileUtils; | ||||
| import me.chanjar.weixin.common.util.http.HttpResponseProxy; | |||||
| import me.chanjar.weixin.common.util.http.MediaDownloadRequestExecutor; | import me.chanjar.weixin.common.util.http.MediaDownloadRequestExecutor; | ||||
| import me.chanjar.weixin.common.util.http.RequestHttp; | import me.chanjar.weixin.common.util.http.RequestHttp; | ||||
| import org.apache.commons.io.FilenameUtils; | |||||
| import org.apache.commons.lang3.StringUtils; | import org.apache.commons.lang3.StringUtils; | ||||
| import java.io.ByteArrayInputStream; | import java.io.ByteArrayInputStream; | ||||
| import java.io.File; | import java.io.File; | ||||
| import java.io.IOException; | import java.io.IOException; | ||||
| import java.io.InputStream; | import java.io.InputStream; | ||||
| import java.util.regex.Matcher; | |||||
| import java.util.regex.Pattern; | |||||
| /** | /** | ||||
| * Created by ecoolper on 2017/5/5. | * Created by ecoolper on 2017/5/5. | ||||
| */ | */ | ||||
| public class JoddHttpMediaDownloadRequestExecutor extends MediaDownloadRequestExecutor<HttpConnectionProvider, ProxyInfo> { | public class JoddHttpMediaDownloadRequestExecutor extends MediaDownloadRequestExecutor<HttpConnectionProvider, ProxyInfo> { | ||||
| public JoddHttpMediaDownloadRequestExecutor(RequestHttp requestHttp, File tmpDirFile) { | public JoddHttpMediaDownloadRequestExecutor(RequestHttp requestHttp, File tmpDirFile) { | ||||
| super(requestHttp, tmpDirFile); | super(requestHttp, tmpDirFile); | ||||
| } | } | ||||
| @@ -54,28 +52,15 @@ public class JoddHttpMediaDownloadRequestExecutor extends MediaDownloadRequestEx | |||||
| throw new WxErrorException(WxError.fromJson(response.bodyText())); | throw new WxErrorException(WxError.fromJson(response.bodyText())); | ||||
| } | } | ||||
| String fileName = getFileName(response); | |||||
| String fileName = new HttpResponseProxy(response).getFileName(); | |||||
| if (StringUtils.isBlank(fileName)) { | if (StringUtils.isBlank(fileName)) { | ||||
| return null; | return null; | ||||
| } | } | ||||
| InputStream inputStream = new ByteArrayInputStream(response.bodyBytes()); | InputStream inputStream = new ByteArrayInputStream(response.bodyBytes()); | ||||
| String[] nameAndExt = fileName.split("\\."); | |||||
| return FileUtils.createTmpFile(inputStream, nameAndExt[0], nameAndExt[1], super.tmpDirFile); | |||||
| return FileUtils.createTmpFile(inputStream, FilenameUtils.getBaseName(fileName), FilenameUtils.getExtension(fileName), | |||||
| super.tmpDirFile); | |||||
| } | } | ||||
| private String getFileName(HttpResponse response) throws WxErrorException { | |||||
| String content = response.header("Content-disposition"); | |||||
| if (content == null || content.length() == 0) { | |||||
| throw new WxErrorException(WxError.newBuilder().setErrorMsg("无法获取到文件名").build()); | |||||
| } | |||||
| Pattern p = Pattern.compile(".*filename=\"(.*)\""); | |||||
| Matcher m = p.matcher(content); | |||||
| if (m.matches()) { | |||||
| return m.group(1); | |||||
| } | |||||
| throw new WxErrorException(WxError.newBuilder().setErrorMsg("无法获取到文件名").build()); | |||||
| } | |||||
| } | } | ||||
| @@ -2,22 +2,21 @@ package me.chanjar.weixin.common.util.http.okhttp; | |||||
| import me.chanjar.weixin.common.bean.result.WxError; | import me.chanjar.weixin.common.bean.result.WxError; | ||||
| import me.chanjar.weixin.common.exception.WxErrorException; | import me.chanjar.weixin.common.exception.WxErrorException; | ||||
| import me.chanjar.weixin.common.util.fs.FileUtils; | |||||
| import me.chanjar.weixin.common.util.http.HttpResponseProxy; | |||||
| import me.chanjar.weixin.common.util.http.MediaDownloadRequestExecutor; | import me.chanjar.weixin.common.util.http.MediaDownloadRequestExecutor; | ||||
| import me.chanjar.weixin.common.util.http.RequestHttp; | import me.chanjar.weixin.common.util.http.RequestHttp; | ||||
| import okhttp3.*; | |||||
| import okhttp3.OkHttpClient; | |||||
| import okhttp3.Request; | |||||
| import okhttp3.Response; | |||||
| import okio.BufferedSink; | import okio.BufferedSink; | ||||
| import okio.Okio; | import okio.Okio; | ||||
| import org.apache.commons.io.FilenameUtils; | |||||
| import org.apache.commons.lang3.StringUtils; | import org.apache.commons.lang3.StringUtils; | ||||
| import org.slf4j.Logger; | import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | import org.slf4j.LoggerFactory; | ||||
| import java.io.ByteArrayInputStream; | |||||
| import java.io.File; | import java.io.File; | ||||
| import java.io.IOException; | import java.io.IOException; | ||||
| import java.io.InputStream; | |||||
| import java.util.regex.Matcher; | |||||
| import java.util.regex.Pattern; | |||||
| /** | /** | ||||
| * Created by ecoolper on 2017/5/5. | * Created by ecoolper on 2017/5/5. | ||||
| @@ -25,7 +24,6 @@ import java.util.regex.Pattern; | |||||
| public class OkHttpMediaDownloadRequestExecutor extends MediaDownloadRequestExecutor<OkHttpClient, OkHttpProxyInfo> { | public class OkHttpMediaDownloadRequestExecutor extends MediaDownloadRequestExecutor<OkHttpClient, OkHttpProxyInfo> { | ||||
| private final Logger logger = LoggerFactory.getLogger(this.getClass()); | private final Logger logger = LoggerFactory.getLogger(this.getClass()); | ||||
| public OkHttpMediaDownloadRequestExecutor(RequestHttp requestHttp, File tmpDirFile) { | public OkHttpMediaDownloadRequestExecutor(RequestHttp requestHttp, File tmpDirFile) { | ||||
| super(requestHttp, tmpDirFile); | super(requestHttp, tmpDirFile); | ||||
| } | } | ||||
| @@ -53,12 +51,13 @@ public class OkHttpMediaDownloadRequestExecutor extends MediaDownloadRequestExec | |||||
| throw new WxErrorException(WxError.fromJson(response.body().string())); | throw new WxErrorException(WxError.fromJson(response.body().string())); | ||||
| } | } | ||||
| String fileName = getFileName(response); | |||||
| String fileName = new HttpResponseProxy(response).getFileName(); | |||||
| if (StringUtils.isBlank(fileName)) { | if (StringUtils.isBlank(fileName)) { | ||||
| return null; | return null; | ||||
| } | } | ||||
| String[] nameAndExt = fileName.split("\\."); | |||||
| File file = File.createTempFile(nameAndExt[0], nameAndExt[1], super.tmpDirFile); | |||||
| File file = File.createTempFile(FilenameUtils.getBaseName(fileName), FilenameUtils.getExtension(fileName), | |||||
| super.tmpDirFile); | |||||
| try (BufferedSink sink = Okio.buffer(Okio.sink(file))) { | try (BufferedSink sink = Okio.buffer(Okio.sink(file))) { | ||||
| sink.writeAll(response.body().source()); | sink.writeAll(response.body().source()); | ||||
| } | } | ||||
| @@ -66,18 +65,4 @@ public class OkHttpMediaDownloadRequestExecutor extends MediaDownloadRequestExec | |||||
| return file; | return file; | ||||
| } | } | ||||
| private String getFileName(Response response) throws WxErrorException { | |||||
| String content = response.header("Content-disposition"); | |||||
| if (content == null || content.length() == 0) { | |||||
| throw new WxErrorException(WxError.newBuilder().setErrorMsg("无法获取到文件名").build()); | |||||
| } | |||||
| Pattern p = Pattern.compile(".*filename=\"(.*)\""); | |||||
| Matcher m = p.matcher(content); | |||||
| if (m.matches()) { | |||||
| return m.group(1); | |||||
| } | |||||
| throw new WxErrorException(WxError.newBuilder().setErrorMsg("无法获取到文件名").build()); | |||||
| } | |||||
| } | } | ||||