| @@ -1,11 +1,9 @@ | |||
| package me.chanjar.weixin.common.util.http; | |||
| import java.io.File; | |||
| import java.io.IOException; | |||
| import java.io.InputStream; | |||
| import java.util.regex.Matcher; | |||
| import java.util.regex.Pattern; | |||
| import me.chanjar.weixin.common.bean.result.WxError; | |||
| import me.chanjar.weixin.common.exception.WxErrorException; | |||
| import me.chanjar.weixin.common.util.StringUtils; | |||
| import me.chanjar.weixin.common.util.fs.FileUtils; | |||
| import org.apache.http.Header; | |||
| import org.apache.http.HttpHost; | |||
| import org.apache.http.client.config.RequestConfig; | |||
| @@ -14,14 +12,15 @@ import org.apache.http.client.methods.HttpGet; | |||
| import org.apache.http.entity.ContentType; | |||
| import org.apache.http.impl.client.CloseableHttpClient; | |||
| import me.chanjar.weixin.common.bean.result.WxError; | |||
| import me.chanjar.weixin.common.exception.WxErrorException; | |||
| import me.chanjar.weixin.common.util.StringUtils; | |||
| import me.chanjar.weixin.common.util.fs.FileUtils; | |||
| import java.io.File; | |||
| import java.io.IOException; | |||
| import java.io.InputStream; | |||
| import java.util.regex.Matcher; | |||
| import java.util.regex.Pattern; | |||
| /** | |||
| * 下载媒体文件请求执行器,请求的参数是String, 返回的结果是File | |||
| * | |||
| * 视频文件不支持下载 | |||
| * @author Daniel Qian | |||
| */ | |||
| public class MediaDownloadRequestExecutor implements RequestExecutor<File, String> { | |||
| @@ -29,15 +28,12 @@ public class MediaDownloadRequestExecutor implements RequestExecutor<File, Strin | |||
| private File tmpDirFile; | |||
| public MediaDownloadRequestExecutor() { | |||
| super(); | |||
| } | |||
| public MediaDownloadRequestExecutor(File tmpDirFile) { | |||
| super(); | |||
| this.tmpDirFile = tmpDirFile; | |||
| } | |||
| @Override | |||
| public File execute(CloseableHttpClient httpclient, HttpHost httpProxy, String uri, String queryParam) throws WxErrorException, IOException { | |||
| if (queryParam != null) { | |||
| @@ -59,20 +55,20 @@ public class MediaDownloadRequestExecutor implements RequestExecutor<File, Strin | |||
| Header[] contentTypeHeader = response.getHeaders("Content-Type"); | |||
| if (contentTypeHeader != null && contentTypeHeader.length > 0) { | |||
| // 下载媒体文件出错 | |||
| if (ContentType.TEXT_PLAIN.getMimeType().equals(contentTypeHeader[0].getValue())) { | |||
| if (contentTypeHeader[0].getValue().startsWith(ContentType.APPLICATION_JSON.getMimeType())) { | |||
| // application/json; encoding=utf-8 下载媒体文件出错 | |||
| String responseContent = Utf8ResponseHandler.INSTANCE.handleResponse(response); | |||
| throw new WxErrorException(WxError.fromJson(responseContent)); | |||
| } | |||
| } | |||
| // 视频文件不支持下载 | |||
| String fileName = getFileName(response); | |||
| if (StringUtils.isBlank(fileName)) { | |||
| return null; | |||
| } | |||
| String[] name_ext = fileName.split("\\."); | |||
| File localFile = FileUtils.createTmpFile(inputStream, name_ext[0], name_ext[1], this.tmpDirFile); | |||
| return localFile; | |||
| String[] nameAndExt = fileName.split("\\."); | |||
| return FileUtils.createTmpFile(inputStream, nameAndExt[0], nameAndExt[1], this.tmpDirFile); | |||
| } finally { | |||
| httpGet.releaseConnection(); | |||
| @@ -80,13 +76,18 @@ public class MediaDownloadRequestExecutor implements RequestExecutor<File, Strin | |||
| } | |||
| protected String getFileName(CloseableHttpResponse response) { | |||
| 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()); | |||
| m.matches(); | |||
| String fileName = m.group(1); | |||
| return fileName; | |||
| if(m.matches()){ | |||
| return m.group(1); | |||
| } | |||
| throw new WxErrorException(WxError.newBuilder().setErrorMsg("无法获取到文件名").build()); | |||
| } | |||
| } | |||