Skip to content

Commit 2914942

Browse files
committed
binarywang#362 修复okhttp实现的qrcode二维码图片下载代码
1 parent 8a58717 commit 2914942

File tree

4 files changed

+37
-37
lines changed

4 files changed

+37
-37
lines changed
Lines changed: 8 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,37 @@
11
package me.chanjar.weixin.common.util.fs;
22

33
import java.io.File;
4-
import java.io.FileOutputStream;
54
import java.io.IOException;
65
import java.io.InputStream;
6+
import java.nio.file.Files;
77

88
public class FileUtils {
99

10-
1110
/**
1211
* 创建临时文件
1312
*
14-
* @param inputStream
13+
* @param inputStream 输入文件流
1514
* @param name 文件名
1615
* @param ext 扩展名
1716
* @param tmpDirFile 临时文件夹目录
1817
*/
1918
public static File createTmpFile(InputStream inputStream, String name, String ext, File tmpDirFile) throws IOException {
20-
File tmpFile;
21-
if (tmpDirFile == null) {
22-
tmpFile = File.createTempFile(name, '.' + ext);
23-
} else {
24-
tmpFile = File.createTempFile(name, '.' + ext, tmpDirFile);
25-
}
26-
27-
tmpFile.deleteOnExit();
28-
29-
try (FileOutputStream fos = new FileOutputStream(tmpFile)) {
30-
int read = 0;
31-
byte[] bytes = new byte[1024 * 100];
32-
while ((read = inputStream.read(bytes)) != -1) {
33-
fos.write(bytes, 0, read);
34-
}
19+
File resultFile = File.createTempFile(name, '.' + ext, tmpDirFile);
3520

36-
fos.flush();
37-
return tmpFile;
38-
}
21+
resultFile.deleteOnExit();
22+
org.apache.commons.io.FileUtils.copyInputStreamToFile(inputStream, resultFile);
23+
return resultFile;
3924
}
4025

4126
/**
4227
* 创建临时文件
4328
*
44-
* @param inputStream
29+
* @param inputStream 输入文件流
4530
* @param name 文件名
4631
* @param ext 扩展名
4732
*/
4833
public static File createTmpFile(InputStream inputStream, String name, String ext) throws IOException {
49-
return createTmpFile(inputStream, name, ext, null);
34+
return createTmpFile(inputStream, name, ext, Files.createTempDirectory("weixin-java-tools-temp").toFile());
5035
}
5136

5237
}

weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/okhttp/OkhttpQrCodeRequestExecutor.java

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,22 @@
77
import me.chanjar.weixin.common.util.http.okhttp.OkHttpProxyInfo;
88
import me.chanjar.weixin.mp.bean.result.WxMpQrCodeTicket;
99
import me.chanjar.weixin.mp.util.http.QrCodeRequestExecutor;
10-
11-
import okhttp3.*;
12-
import okio.BufferedSink;
13-
import okio.Okio;
10+
import okhttp3.OkHttpClient;
11+
import okhttp3.Request;
12+
import okhttp3.Response;
1413
import org.slf4j.Logger;
1514
import org.slf4j.LoggerFactory;
1615

17-
import java.io.ByteArrayInputStream;
1816
import java.io.File;
1917
import java.io.IOException;
2018
import java.io.InputStream;
19+
import java.net.URLEncoder;
2120
import java.util.UUID;
2221

2322
/**
24-
* Created by ecoolper on 2017/5/5.
23+
*
24+
* @author ecoolper
25+
* @date 2017/5/5
2526
*/
2627
public class OkhttpQrCodeRequestExecutor extends QrCodeRequestExecutor<OkHttpClient, OkHttpProxyInfo> {
2728
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@@ -31,9 +32,18 @@ public OkhttpQrCodeRequestExecutor(RequestHttp requestHttp) {
3132
}
3233

3334
@Override
34-
public File execute(String uri, WxMpQrCodeTicket data) throws WxErrorException, IOException {
35+
public File execute(String uri, WxMpQrCodeTicket ticket) throws WxErrorException, IOException {
3536
logger.debug("OkhttpQrCodeRequestExecutor is running");
36-
//得到httpClient
37+
38+
if (ticket != null) {
39+
if (uri.indexOf('?') == -1) {
40+
uri += '?';
41+
}
42+
uri += uri.endsWith("?")
43+
? "ticket=" + URLEncoder.encode(ticket.getTicket(), "UTF-8")
44+
: "&ticket=" + URLEncoder.encode(ticket.getTicket(), "UTF-8");
45+
}
46+
3747
OkHttpClient client = requestHttp.getRequestHttpClient();
3848
Request request = new Request.Builder().url(uri).get().build();
3949
Response response = client.newCall(request).execute();
@@ -42,12 +52,10 @@ public File execute(String uri, WxMpQrCodeTicket data) throws WxErrorException,
4252
String responseContent = response.body().string();
4353
throw new WxErrorException(WxError.fromJson(responseContent));
4454
}
45-
File temp = File.createTempFile(UUID.randomUUID().toString(), ".png");
46-
try (BufferedSink sink = Okio.buffer(Okio.sink(temp))) {
47-
sink.writeAll(response.body().source());
55+
56+
try (InputStream inputStream = response.body().byteStream()) {
57+
return FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), "jpg");
4858
}
49-
temp.deleteOnExit();
5059

51-
return temp;
5260
}
5361
}

weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpQrcodeServiceImplTest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@
55
import me.chanjar.weixin.mp.api.WxMpService;
66
import me.chanjar.weixin.mp.api.test.ApiTestModule;
77
import me.chanjar.weixin.mp.bean.result.WxMpQrCodeTicket;
8+
import org.apache.commons.io.FileUtils;
89
import org.apache.commons.lang3.RandomStringUtils;
910
import org.testng.*;
1011
import org.testng.annotations.*;
1112

1213
import java.io.File;
14+
import java.io.IOException;
1315

1416
/**
1517
* 测试用户相关的接口
@@ -65,6 +67,12 @@ public void testQrCodePicture() throws WxErrorException {
6567
File file = this.wxService.getQrcodeService().qrCodePicture(ticket);
6668
Assert.assertNotNull(file);
6769
System.out.println(file.getAbsolutePath());
70+
71+
try {
72+
FileUtils.copyFile(file,new File("d:\\t.jpg"));
73+
} catch (IOException e) {
74+
e.printStackTrace();
75+
}
6876
}
6977

7078
public void testQrCodePictureUrl() throws WxErrorException {

weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/test/ApiTestModule.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import me.chanjar.weixin.common.util.xml.XStreamInitializer;
77
import me.chanjar.weixin.mp.api.WxMpConfigStorage;
88
import me.chanjar.weixin.mp.api.WxMpService;
9-
import me.chanjar.weixin.mp.api.impl.WxMpServiceApacheHttpClientImpl;
109
import me.chanjar.weixin.mp.api.impl.WxMpServiceOkHttpImpl;
1110

1211
import java.io.IOException;

0 commit comments

Comments
 (0)