瀏覽代碼

#362 修复okhttp实现的qrcode二维码图片下载代码

master
Binary Wang 7 年之前
父節點
當前提交
29149424ac
共有 4 個檔案被更改,包括 37 行新增37 行删除
  1. +8
    -23
      weixin-java-common/src/main/java/me/chanjar/weixin/common/util/fs/FileUtils.java
  2. +21
    -13
      weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/okhttp/OkhttpQrCodeRequestExecutor.java
  3. +8
    -0
      weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpQrcodeServiceImplTest.java
  4. +0
    -1
      weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/test/ApiTestModule.java

+ 8
- 23
weixin-java-common/src/main/java/me/chanjar/weixin/common/util/fs/FileUtils.java 查看文件

@@ -1,52 +1,37 @@
package me.chanjar.weixin.common.util.fs;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;

public class FileUtils {


/**
* 创建临时文件
*
* @param inputStream
* @param inputStream 输入文件流
* @param name 文件名
* @param ext 扩展名
* @param tmpDirFile 临时文件夹目录
*/
public static File createTmpFile(InputStream inputStream, String name, String ext, File tmpDirFile) throws IOException {
File tmpFile;
if (tmpDirFile == null) {
tmpFile = File.createTempFile(name, '.' + ext);
} else {
tmpFile = File.createTempFile(name, '.' + ext, tmpDirFile);
}

tmpFile.deleteOnExit();

try (FileOutputStream fos = new FileOutputStream(tmpFile)) {
int read = 0;
byte[] bytes = new byte[1024 * 100];
while ((read = inputStream.read(bytes)) != -1) {
fos.write(bytes, 0, read);
}
File resultFile = File.createTempFile(name, '.' + ext, tmpDirFile);

fos.flush();
return tmpFile;
}
resultFile.deleteOnExit();
org.apache.commons.io.FileUtils.copyInputStreamToFile(inputStream, resultFile);
return resultFile;
}

/**
* 创建临时文件
*
* @param inputStream
* @param inputStream 输入文件流
* @param name 文件名
* @param ext 扩展名
*/
public static File createTmpFile(InputStream inputStream, String name, String ext) throws IOException {
return createTmpFile(inputStream, name, ext, null);
return createTmpFile(inputStream, name, ext, Files.createTempDirectory("weixin-java-tools-temp").toFile());
}

}

+ 21
- 13
weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/okhttp/OkhttpQrCodeRequestExecutor.java 查看文件

@@ -7,21 +7,22 @@ import me.chanjar.weixin.common.util.http.RequestHttp;
import me.chanjar.weixin.common.util.http.okhttp.OkHttpProxyInfo;
import me.chanjar.weixin.mp.bean.result.WxMpQrCodeTicket;
import me.chanjar.weixin.mp.util.http.QrCodeRequestExecutor;

import okhttp3.*;
import okio.BufferedSink;
import okio.Okio;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
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.net.URLEncoder;
import java.util.UUID;

/**
* Created by ecoolper on 2017/5/5.
*
* @author ecoolper
* @date 2017/5/5
*/
public class OkhttpQrCodeRequestExecutor extends QrCodeRequestExecutor<OkHttpClient, OkHttpProxyInfo> {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@@ -31,9 +32,18 @@ public class OkhttpQrCodeRequestExecutor extends QrCodeRequestExecutor<OkHttpCli
}

@Override
public File execute(String uri, WxMpQrCodeTicket data) throws WxErrorException, IOException {
public File execute(String uri, WxMpQrCodeTicket ticket) throws WxErrorException, IOException {
logger.debug("OkhttpQrCodeRequestExecutor is running");
//得到httpClient

if (ticket != null) {
if (uri.indexOf('?') == -1) {
uri += '?';
}
uri += uri.endsWith("?")
? "ticket=" + URLEncoder.encode(ticket.getTicket(), "UTF-8")
: "&ticket=" + URLEncoder.encode(ticket.getTicket(), "UTF-8");
}

OkHttpClient client = requestHttp.getRequestHttpClient();
Request request = new Request.Builder().url(uri).get().build();
Response response = client.newCall(request).execute();
@@ -42,12 +52,10 @@ public class OkhttpQrCodeRequestExecutor extends QrCodeRequestExecutor<OkHttpCli
String responseContent = response.body().string();
throw new WxErrorException(WxError.fromJson(responseContent));
}
File temp = File.createTempFile(UUID.randomUUID().toString(), ".png");
try (BufferedSink sink = Okio.buffer(Okio.sink(temp))) {
sink.writeAll(response.body().source());
try (InputStream inputStream = response.body().byteStream()) {
return FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), "jpg");
}
temp.deleteOnExit();

return temp;
}
}

+ 8
- 0
weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpQrcodeServiceImplTest.java 查看文件

@@ -5,11 +5,13 @@ import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.api.test.ApiTestModule;
import me.chanjar.weixin.mp.bean.result.WxMpQrCodeTicket;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.testng.*;
import org.testng.annotations.*;

import java.io.File;
import java.io.IOException;

/**
* 测试用户相关的接口
@@ -65,6 +67,12 @@ public class WxMpQrcodeServiceImplTest {
File file = this.wxService.getQrcodeService().qrCodePicture(ticket);
Assert.assertNotNull(file);
System.out.println(file.getAbsolutePath());

try {
FileUtils.copyFile(file,new File("d:\\t.jpg"));
} catch (IOException e) {
e.printStackTrace();
}
}

public void testQrCodePictureUrl() throws WxErrorException {


+ 0
- 1
weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/test/ApiTestModule.java 查看文件

@@ -6,7 +6,6 @@ import com.thoughtworks.xstream.XStream;
import me.chanjar.weixin.common.util.xml.XStreamInitializer;
import me.chanjar.weixin.mp.api.WxMpConfigStorage;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.api.impl.WxMpServiceApacheHttpClientImpl;
import me.chanjar.weixin.mp.api.impl.WxMpServiceOkHttpImpl;

import java.io.IOException;


Loading…
取消
儲存