diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/HttpResponseProxy.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/HttpResponseProxy.java
new file mode 100644
index 00000000..a75aa963
--- /dev/null
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/HttpResponseProxy.java
@@ -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;
+
+/**
+ *
+ * 三种http框架的response代理类,方便提取公共方法
+ * Created by Binary Wang on 2017-8-3.
+ *
+ *
+ * @author Binary Wang
+ */
+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());
+ }
+
+}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMediaDownloadRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMediaDownloadRequestExecutor.java
index 6a928648..0a5a5048 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMediaDownloadRequestExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMediaDownloadRequestExecutor.java
@@ -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.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.RequestHttp;
+import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.Header;
import org.apache.http.HttpHost;
@@ -17,15 +19,12 @@ import org.apache.http.impl.client.CloseableHttpClient;
import java.io.File;
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.
*/
public class ApacheMediaDownloadRequestExecutor extends MediaDownloadRequestExecutor {
-
public ApacheMediaDownloadRequestExecutor(RequestHttp requestHttp, File 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)) {
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 {
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());
- }
-
}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpMediaDownloadRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpMediaDownloadRequestExecutor.java
index edbee766..bbd8bec4 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpMediaDownloadRequestExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpMediaDownloadRequestExecutor.java
@@ -5,27 +5,25 @@ import jodd.http.HttpRequest;
import jodd.http.HttpResponse;
import jodd.http.ProxyInfo;
import jodd.util.StringPool;
-
import me.chanjar.weixin.common.bean.result.WxError;
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.RequestHttp;
+import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils;
import java.io.ByteArrayInputStream;
import java.io.File;
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.
*/
public class JoddHttpMediaDownloadRequestExecutor extends MediaDownloadRequestExecutor {
-
public JoddHttpMediaDownloadRequestExecutor(RequestHttp requestHttp, File tmpDirFile) {
super(requestHttp, tmpDirFile);
}
@@ -54,28 +52,15 @@ public class JoddHttpMediaDownloadRequestExecutor extends MediaDownloadRequestEx
throw new WxErrorException(WxError.fromJson(response.bodyText()));
}
- String fileName = getFileName(response);
+ String fileName = new HttpResponseProxy(response).getFileName();
if (StringUtils.isBlank(fileName)) {
return null;
}
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());
- }
}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMediaDownloadRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMediaDownloadRequestExecutor.java
index 246ce4dc..0923527b 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMediaDownloadRequestExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMediaDownloadRequestExecutor.java
@@ -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.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.RequestHttp;
-import okhttp3.*;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
import okio.BufferedSink;
import okio.Okio;
+import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.ByteArrayInputStream;
import java.io.File;
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.
@@ -25,7 +24,6 @@ import java.util.regex.Pattern;
public class OkHttpMediaDownloadRequestExecutor extends MediaDownloadRequestExecutor {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
-
public OkHttpMediaDownloadRequestExecutor(RequestHttp requestHttp, File tmpDirFile) {
super(requestHttp, tmpDirFile);
}
@@ -53,12 +51,13 @@ public class OkHttpMediaDownloadRequestExecutor extends MediaDownloadRequestExec
throw new WxErrorException(WxError.fromJson(response.body().string()));
}
- String fileName = getFileName(response);
+ String fileName = new HttpResponseProxy(response).getFileName();
if (StringUtils.isBlank(fileName)) {
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))) {
sink.writeAll(response.body().source());
}
@@ -66,18 +65,4 @@ public class OkHttpMediaDownloadRequestExecutor extends MediaDownloadRequestExec
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());
- }
-
}