commit
83627f1b2f
@ -0,0 +1,189 @@ |
||||
package com.gitee.sop.websiteserver.bean; |
||||
|
||||
import lombok.Data; |
||||
import okhttp3.Cookie; |
||||
import okhttp3.CookieJar; |
||||
import okhttp3.FormBody; |
||||
import okhttp3.HttpUrl; |
||||
import okhttp3.MultipartBody; |
||||
import okhttp3.OkHttpClient; |
||||
import okhttp3.Request; |
||||
import okhttp3.RequestBody; |
||||
import okhttp3.Response; |
||||
|
||||
import java.io.IOException; |
||||
import java.nio.charset.StandardCharsets; |
||||
import java.util.ArrayList; |
||||
import java.util.HashMap; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
import java.util.Set; |
||||
import java.util.concurrent.TimeUnit; |
||||
|
||||
/** |
||||
* @author tanghc |
||||
*/ |
||||
public class HttpTool { |
||||
private static final String METHOD_GET = "get"; |
||||
private Map<String, List<Cookie>> cookieStore = new HashMap<String, List<Cookie>>(); |
||||
|
||||
private OkHttpClient httpClient; |
||||
|
||||
public HttpTool() { |
||||
this(new HttpToolConfig()); |
||||
} |
||||
|
||||
public HttpTool(HttpToolConfig httpToolConfig) { |
||||
this.initHttpClient(httpToolConfig); |
||||
} |
||||
|
||||
protected void initHttpClient(HttpToolConfig httpToolConfig) { |
||||
httpClient = new OkHttpClient.Builder() |
||||
.connectTimeout(httpToolConfig.connectTimeoutSeconds, TimeUnit.SECONDS) // 设置链接超时时间,默认10秒
|
||||
.readTimeout(httpToolConfig.readTimeoutSeconds, TimeUnit.SECONDS) |
||||
.writeTimeout(httpToolConfig.writeTimeoutSeconds, TimeUnit.SECONDS) |
||||
.cookieJar(new CookieJar() { |
||||
public void saveFromResponse(HttpUrl httpUrl, List<Cookie> list) { |
||||
cookieStore.put(httpUrl.host(), list); |
||||
} |
||||
public List<Cookie> loadForRequest(HttpUrl httpUrl) { |
||||
List<Cookie> cookies = cookieStore.get(httpUrl.host()); |
||||
return cookies != null ? cookies : new ArrayList<Cookie>(); |
||||
} |
||||
}).build(); |
||||
} |
||||
|
||||
@Data |
||||
public static class HttpToolConfig { |
||||
/** 请求超时时间 */ |
||||
private int connectTimeoutSeconds = 10; |
||||
/** http读取超时时间 */ |
||||
private int readTimeoutSeconds = 10; |
||||
/** http写超时时间 */ |
||||
private int writeTimeoutSeconds = 10; |
||||
} |
||||
|
||||
/** |
||||
* get请求 |
||||
* |
||||
* @param url |
||||
* @param header |
||||
* @return |
||||
* @throws IOException |
||||
*/ |
||||
public String get(String url, Map<String, String> header) throws IOException { |
||||
Request.Builder builder = new Request.Builder().url(url).get(); |
||||
// 添加header
|
||||
addHeader(builder, header); |
||||
|
||||
Request request = builder.build(); |
||||
Response response = httpClient.newCall(request).execute(); |
||||
return response.body().string(); |
||||
} |
||||
|
||||
/** |
||||
* 提交表单 |
||||
* |
||||
* @param url url |
||||
* @param form 参数 |
||||
* @param header header |
||||
* @param method 请求方式,post,get等 |
||||
* @return |
||||
* @throws IOException |
||||
*/ |
||||
public String request(String url, Map<String, String> form, Map<String, String> header, String method) throws IOException { |
||||
Request.Builder requestBuilder; |
||||
if (METHOD_GET.equalsIgnoreCase(method)) { |
||||
HttpUrl.Builder urlBuilder = HttpUrl.parse(url).newBuilder(); |
||||
for (Map.Entry<String, String> entry : form.entrySet()) { |
||||
urlBuilder.addQueryParameter(entry.getKey(), entry.getValue()); |
||||
} |
||||
requestBuilder = new Request.Builder() |
||||
.url(urlBuilder.build()) |
||||
.get(); |
||||
} else { |
||||
FormBody.Builder paramBuilder = new FormBody.Builder(StandardCharsets.UTF_8); |
||||
for (Map.Entry<String, String> entry : form.entrySet()) { |
||||
paramBuilder.add(entry.getKey(), entry.getValue()); |
||||
} |
||||
FormBody formBody = paramBuilder.build(); |
||||
requestBuilder = new Request.Builder() |
||||
.url(url) |
||||
.method(method, formBody); |
||||
} |
||||
// 添加header
|
||||
addHeader(requestBuilder, header); |
||||
|
||||
Request request = requestBuilder.build(); |
||||
Response response = httpClient |
||||
.newCall(request) |
||||
.execute(); |
||||
try { |
||||
return response.body().string(); |
||||
} finally { |
||||
response.close(); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 提交表单,并且上传文件 |
||||
* |
||||
* @param url |
||||
* @param form |
||||
* @param header |
||||
* @param files |
||||
* @return |
||||
* @throws IOException |
||||
*/ |
||||
public String requestFile(String url, Map<String, String> form, Map<String, String> header, List<UploadFile> files) |
||||
throws IOException { |
||||
// 创建MultipartBody.Builder,用于添加请求的数据
|
||||
MultipartBody.Builder bodyBuilder = new MultipartBody.Builder(); |
||||
bodyBuilder.setType(MultipartBody.FORM); |
||||
|
||||
for (UploadFile uploadFile : files) { |
||||
bodyBuilder.addFormDataPart(uploadFile.getName(), // 请求的名字
|
||||
uploadFile.getFileName(), // 文件的文字,服务器端用来解析的
|
||||
RequestBody.create(null, uploadFile.getFileData()) // 创建RequestBody,把上传的文件放入
|
||||
); |
||||
} |
||||
|
||||
Set<Map.Entry<String, String>> entrySet = form.entrySet(); |
||||
for (Map.Entry<String, String> entry : entrySet) { |
||||
bodyBuilder.addFormDataPart(entry.getKey(), entry.getValue()); |
||||
} |
||||
|
||||
RequestBody requestBody = bodyBuilder.build(); |
||||
|
||||
Request.Builder builder = new Request.Builder().url(url).post(requestBody); |
||||
|
||||
// 添加header
|
||||
addHeader(builder, header); |
||||
|
||||
Request request = builder.build(); |
||||
Response response = httpClient.newCall(request).execute(); |
||||
try { |
||||
return response.body().string(); |
||||
} finally { |
||||
response.close(); |
||||
} |
||||
} |
||||
|
||||
private void addHeader(Request.Builder builder, Map<String, String> header) { |
||||
if (header != null) { |
||||
Set<Map.Entry<String, String>> entrySet = header.entrySet(); |
||||
for (Map.Entry<String, String> entry : entrySet) { |
||||
builder.addHeader(entry.getKey(), String.valueOf(entry.getValue())); |
||||
} |
||||
} |
||||
} |
||||
|
||||
public void setCookieStore(Map<String, List<Cookie>> cookieStore) { |
||||
this.cookieStore = cookieStore; |
||||
} |
||||
|
||||
public void setHttpClient(OkHttpClient httpClient) { |
||||
this.httpClient = httpClient; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,60 @@ |
||||
package com.gitee.sop.websiteserver.bean; |
||||
|
||||
|
||||
import com.gitee.sop.websiteserver.util.FileUtil; |
||||
import lombok.Getter; |
||||
import lombok.Setter; |
||||
import org.apache.commons.codec.digest.DigestUtils; |
||||
|
||||
import java.io.File; |
||||
import java.io.IOException; |
||||
import java.io.InputStream; |
||||
import java.io.Serializable; |
||||
|
||||
/** |
||||
* 文件上传类 |
||||
* @author tanghc |
||||
*/ |
||||
@Getter |
||||
@Setter |
||||
public class UploadFile implements Serializable { |
||||
private static final long serialVersionUID = -1100614660944996398L; |
||||
|
||||
/** |
||||
* @param name 表单名称,不能重复 |
||||
* @param file 文件 |
||||
* @throws IOException |
||||
*/ |
||||
public UploadFile(String name, File file) throws IOException { |
||||
this(name, file.getName(), FileUtil.toBytes(file)); |
||||
} |
||||
|
||||
/** |
||||
* @param name 表单名称,不能重复 |
||||
* @param fileName 文件名 |
||||
* @param input 文件流 |
||||
* @throws IOException |
||||
*/ |
||||
public UploadFile(String name, String fileName, InputStream input) throws IOException { |
||||
this(name, fileName, FileUtil.toBytes(input)); |
||||
} |
||||
|
||||
/** |
||||
* @param name 表单名称,不能重复 |
||||
* @param fileName 文件名 |
||||
* @param fileData 文件数据 |
||||
*/ |
||||
public UploadFile(String name, String fileName, byte[] fileData) { |
||||
super(); |
||||
this.name = name; |
||||
this.fileName = fileName; |
||||
this.fileData = fileData; |
||||
this.md5 = DigestUtils.md5Hex(fileData); |
||||
} |
||||
|
||||
private String name; |
||||
private String fileName; |
||||
private byte[] fileData; |
||||
private String md5; |
||||
|
||||
} |
@ -0,0 +1,65 @@ |
||||
package com.gitee.sop.websiteserver.util; |
||||
|
||||
import java.io.ByteArrayOutputStream; |
||||
import java.io.File; |
||||
import java.io.FileInputStream; |
||||
import java.io.FileNotFoundException; |
||||
import java.io.IOException; |
||||
import java.io.InputStream; |
||||
|
||||
public class FileUtil { |
||||
|
||||
/** |
||||
* The default buffer size to use. |
||||
*/ |
||||
private static final int DEFAULT_BUFFER_SIZE = 1024 * 4; |
||||
private static final int EOF = -1; |
||||
|
||||
/** |
||||
* 将文件流转换成byte[] |
||||
* @param input |
||||
* @return |
||||
* @throws IOException |
||||
*/ |
||||
public static byte[] toBytes(InputStream input) throws IOException { |
||||
ByteArrayOutputStream output = new ByteArrayOutputStream(); |
||||
int n = 0; |
||||
byte[] buffer = new byte[DEFAULT_BUFFER_SIZE]; |
||||
|
||||
while (EOF != (n = input.read(buffer))) { |
||||
output.write(buffer, 0, n); |
||||
} |
||||
return output.toByteArray(); |
||||
} |
||||
|
||||
/** |
||||
* 将文件转换成数据流 |
||||
* @param file 文件 |
||||
* @return 返回数据流 |
||||
* @throws IOException |
||||
*/ |
||||
public static byte[] toBytes(File file) throws IOException { |
||||
if (file.exists()) { |
||||
if (file.isDirectory()) { |
||||
throw new IOException("File '" + file + "' exists but is a directory"); |
||||
} |
||||
if (file.canRead() == false) { |
||||
throw new IOException("File '" + file + "' cannot be read"); |
||||
} |
||||
} else { |
||||
throw new FileNotFoundException("File '" + file + "' does not exist"); |
||||
} |
||||
InputStream input = null; |
||||
try { |
||||
input = new FileInputStream(file); |
||||
return toBytes(input); |
||||
} finally { |
||||
try { |
||||
if (input != null) { |
||||
input.close(); |
||||
} |
||||
} catch (IOException ioe) { |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,38 @@ |
||||
package com.gitee.sop.websiteserver.util; |
||||
|
||||
import org.apache.tomcat.util.http.fileupload.servlet.ServletFileUpload; |
||||
import org.springframework.web.multipart.MultipartFile; |
||||
import org.springframework.web.multipart.MultipartHttpServletRequest; |
||||
|
||||
import javax.servlet.http.HttpServletRequest; |
||||
import java.util.Collection; |
||||
import java.util.Collections; |
||||
import java.util.Map; |
||||
import java.util.Optional; |
||||
|
||||
/** |
||||
* 文件上传工具类 |
||||
* |
||||
* @author tanghc |
||||
*/ |
||||
public class UploadUtil { |
||||
|
||||
/** |
||||
* 获取上传文件 |
||||
* |
||||
* @param request |
||||
* @return |
||||
*/ |
||||
public static Collection<MultipartFile> getUploadFiles(HttpServletRequest request) { |
||||
Map<String, MultipartFile> fileMap = null; |
||||
//检查form中是否有enctype="multipart/form-data"
|
||||
if (ServletFileUpload.isMultipartContent(request)) { |
||||
//将request变成多部分request
|
||||
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request; |
||||
fileMap = multiRequest.getFileMap(); |
||||
} |
||||
return Optional.ofNullable(fileMap) |
||||
.map(map -> map.values()) |
||||
.orElse(Collections.emptyList()); |
||||
} |
||||
} |
Loading…
Reference in new issue