单文件/二进制上传
HTTP协议,请求报文包含:请求行、请求头、请求体。
单文件/二进制上传协议:
POST /web/upload/binary HTTP/1.1
header-name: header-value
Content-type: image/jpeg
User-Agent: PostmanRuntime/7.28.4
Host: 127.0.0.1:8080
Proxy-Connection: Keep-Alive
Content-Length: 1920
--二进制(略)
服务器端Servlet实现
Servlet实现类
package com.what21.servlet.upload;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.what21.servlet.upload.helper.HttpServletUploadHelper;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
@WebServlet("/upload/binary")
public class BinaryUploadServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Map<String, Object> dataMap = new HashMap<>();
dataMap.put("code", "ok");
// ===================================================================================//
// ===== 解析参数&保存文件
// ===================================================================================//
String domain = ""; // 域
String function = "head"; // 功能
String storagePath = "D:/Temp/Upload/";
try {
HttpServletUploadHelper.Entity entity = HttpServletUploadHelper.createEntityWithHeader(request, domain, function);
String saveFilePath = storagePath + entity.getStorageAddress();
File file = HttpServletUploadHelper.exchangeSave(request.getInputStream(), saveFilePath);
entity.setSize(file.length());
dataMap.put("data", entity);
} catch (Exception e) {
e.printStackTrace();
dataMap.put("code", "error");
dataMap.put("msg", e.getMessage());
}
// ===================================================================================//
// ===== 返回结果
// ===================================================================================//
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(dataMap);
response.setContentType("text/json;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter writer = response.getWriter();
writer.print(json);
writer.flush();
}
}
助手类
package com.what21.servlet.upload.helper;
import com.relops.snowflake.Snowflake;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Random;
public final class HttpServletUploadHelper {
// ===================================================================================//
// ===== header中操作
// ===================================================================================//
/**
* 从header中获取值
*
* @param request
* @param name
* @param defaultValue
* @return
*/
public static String getHeaderValue(HttpServletRequest request, String name, String defaultValue) {
String value = request.getHeader(name);
if (StringUtils.isNotEmpty(value)) {
return value;
}
return defaultValue;
}
// ===================================================================================//
// ===== 文件操作
// ===================================================================================//
/**
* 获取文件后缀
*
* @param name
* @return
*/
public static String getFileSuffix(String name) {
if (StringUtils.isNotEmpty(name)) {
if (name.contains(".")) {
return name.split("\\.")[1];
}
}
return "";
}
/**
* 交换保存
*
* @param inputStream
* @param filename
* @throws IOException
*/
public static File exchangeSave(InputStream inputStream, String filename) throws IOException {
File saveFile = new File(filename);
if (!saveFile.getParentFile().exists()) {
saveFile.getParentFile().mkdirs();
}
FileOutputStream output = new FileOutputStream(filename);
int r = -1;
byte[] bytes = new byte[512];
while ((r = inputStream.read(bytes)) != -1) {
output.write(bytes, 0, r);
}
output.flush();
output.close();
return saveFile;
}
// ===================================================================================//
// ===== 实体操作
// ===================================================================================//
/**
* 从header中取参数
*
* @param request
* @param domain
* @param function
* @return
* @throws IOException
*/
public static Entity createEntityWithHeader(HttpServletRequest request, String domain, String function) throws IOException {
Entity entity = new Entity();
entity.setId(getSnowflakeId());
entity.setModular(HttpServletUploadHelper.getHeaderValue(request, "modular", "communal"));
entity.setModel(HttpServletUploadHelper.getHeaderValue(request, "model", "common"));
entity.setName(HttpServletUploadHelper.getHeaderValue(request, "name", getRandomString(30)));
entity.setType(HttpServletUploadHelper.getHeaderValue(request, "type", "file"));
entity.setSuffix(HttpServletUploadHelper.getFileSuffix(entity.getName()));
entity.setFile(entity.getId() + "." + entity.getSuffix());
String accessAddress = "/" + entity.getModular() + "/" + entity.getModular();
String storageAddress = "/" + entity.getModular() + "/" + entity.getModular();
if (StringUtils.isNotEmpty(domain)) {
accessAddress = domain + "/" + accessAddress;
storageAddress = domain + "/" + storageAddress;
}
if (StringUtils.isNotEmpty(function)) {
accessAddress = accessAddress + "/" + function;
storageAddress = storageAddress + "/" + function;
}
accessAddress = accessAddress + "/" + entity.getId();
storageAddress = storageAddress + "/" + entity.getId();
entity.setAccessAddress(accessAddress);
entity.setStorageAddress(storageAddress);
entity.setStatus(0);
return entity;
}
// ===================================================================================//
// ===== 实体类
// ===================================================================================//
@Data
public static class Entity {
// 主键ID
private Long id;
// 系统一级模块
private String modular;
// 系统二级模块
private String model;
// 静态资源名称
private String name;
// 静态资源类型
private String type;
// 静态资源文件
private String file;
// 文件大小
private Long size;
// 静态资源后缀
private String suffix;
// 静态资源状态
private Integer status;
// 资源存储地址
private String storageAddress;
// 资源访问地址
private String accessAddress;
}
// ===================================================================================//
// ===== 工具操作
// ===================================================================================//
/**
* @return
*/
public static Long getSnowflakeId() {
return getSnowflakeId(1);
}
/**
* @param node
* @return
*/
public static Long getSnowflakeId(int node) {
Snowflake snowflake = new Snowflake(node);
return snowflake.next();
}
/**
* 获取随机字符串
*
* @param length
* @return
*/
public static String getRandomString(int length) {
String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
Random random = new Random();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < length; i++) {
int number = random.nextInt(62);
sb.append(str.charAt(number));
}
return sb.toString();
}
// ===================================================================================//
// ===== The end
// ===================================================================================//
}
单文件上传客户端测试
Postman测试
HttpClient客户端实现
HttpClient4.5相关:Java,HttpClient4.5,https连接请求调用、Java,HttpClient4.5,https及使用连接池、Java,Netty,HttpClient,实现代理。
工具类
package com.what21.httpclient4;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.InputStreamEntity;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicHeader;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.*;
public class HttpClientHelperUtils {
/**
* @param url
* @return
*/
public static String get(String url) {
String result = null;
HttpEntity httpEntity = null;
try {
CloseableHttpClient httpClient = HttpClients.createDefault();
// 创建POST
HttpGet httpGet = new HttpGet(url);
httpGet.setConfig(getRequestConfig());
// 设置头参数
Header header = new BasicHeader("Accept-Encoding", null);
httpGet.setHeader(header);
CloseableHttpResponse httpResponse = httpClient.execute(httpGet);
httpEntity = httpResponse.getEntity();
result = EntityUtils.toString(httpEntity);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
EntityUtils.consume(httpEntity);
} catch (IOException e) {
// http请求释放资源异常
e.printStackTrace();
}
}
return result;
}
/**
* @param url
* @param paramsMap
* @return
*/
public static String post(String url, Map<String, String> paramsMap) {
String result = null;
HttpEntity httpEntity = null;
try {
CloseableHttpClient httpClient = HttpClients.createDefault();
// 创建POST
HttpPost httpPost = new HttpPost(url);
httpPost.setConfig(getRequestConfig());
// 设置头参数
Header header = new BasicHeader("Accept-Encoding", null);
httpPost.setHeader(header);
// 添加参数
List<NameValuePair> nameValuePairs = new ArrayList<>();
if (paramsMap != null && paramsMap.size() > 0) {
Set<String> keySet = paramsMap.keySet();
Iterator it = keySet.iterator();
while (it.hasNext()) {
String key = (String) it.next();
String value = paramsMap.get(key);
nameValuePairs.add(new BasicNameValuePair(key, value));
}
}
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
// 执行
CloseableHttpResponse httpResponse = httpClient.execute(httpPost);
httpEntity = httpResponse.getEntity();
result = EntityUtils.toString(httpEntity);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
EntityUtils.consume(httpEntity);
} catch (IOException e) {
// http请求释放资源异常
e.printStackTrace();
}
}
return result;
}
/**
* @param url
* @param json
* @return
*/
public static String postByContentTypeToJson(String url, String json) {
String result = null;
HttpEntity httpEntity = null;
try {
CloseableHttpClient httpClient = HttpClients.createDefault();
// 创建POST
HttpPost httpPost = new HttpPost(url);
httpPost.setConfig(getRequestConfig());
// 设置头参数
Header header = new BasicHeader("Accept-Encoding", null);
httpPost.setHeader(header);
// 头设置报文和通讯格式
StringEntity stringEntity = new StringEntity(json, ContentType.APPLICATION_JSON);
stringEntity.setContentEncoding("UTF-8");
httpPost.setEntity(stringEntity);
CloseableHttpResponse httpResponse = httpClient.execute(httpPost);
httpEntity = httpResponse.getEntity();
result = EntityUtils.toString(httpEntity);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
EntityUtils.consume(httpEntity);
} catch (IOException e) {
// http请求释放资源异常
e.printStackTrace();
}
}
return result;
}
/**
* @param url
* @param headerMap
* @param inputStream
* @return
*/
public static String binaryUpload(String url, Map<String, String> headerMap, FileInputStream inputStream) {
String result = null;
HttpEntity httpEntity = null;
try {
CloseableHttpClient httpClient = HttpClients.createDefault();
// 创建POST
HttpPost httpPost = new HttpPost(url);
httpPost.setConfig(getRequestConfig());
// 设置头参数
Header header = new BasicHeader("Accept-Encoding", null);
httpPost.setHeader(header);
// 添加参数
if (headerMap != null && headerMap.size() > 0) {
Set<String> keySet = headerMap.keySet();
Iterator it = keySet.iterator();
while (it.hasNext()) {
String key = (String) it.next();
String value = headerMap.get(key);
httpPost.addHeader(key, value);
}
}
// 头设置报文和通讯格式
InputStreamEntity inputStreamEntity = new InputStreamEntity(inputStream);
httpPost.setEntity(inputStreamEntity);
CloseableHttpResponse httpResponse = httpClient.execute(httpPost);
httpEntity = httpResponse.getEntity();
result = EntityUtils.toString(httpEntity);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
EntityUtils.consume(httpEntity);
} catch (IOException e) {
// http请求释放资源异常
e.printStackTrace();
}
}
return result;
}
/**
* @return
*/
public static RequestConfig getRequestConfig() {
RequestConfig requestConfig = RequestConfig.custom()
.setSocketTimeout(180 * 1000) // 连接超时时间
.setConnectTimeout(180 * 1000) // 请求超时时间
.setConnectionRequestTimeout(180 * 1000) // 连接请求超时时间
.setRedirectsEnabled(true) // 重定向开关
.build();
return requestConfig;
}
}
测试类
package com.what21.servlet.upload;
import com.what21.httpclient4.HttpClientHelperUtils;
import java.io.FileInputStream;
import java.util.HashMap;
import java.util.Map;
public class HttpClientBinaryUploadDemo {
public static void main(String[] args) throws Exception {
String upload = "http://localhost:9090/web/upload/binary";
Map<String, String> headerMap = new HashMap<>();
headerMap.put("modular", "system");
headerMap.put("model", "org");
headerMap.put("name", "a101.png");
headerMap.put("type", "png");
String file = "D:\\a101.png";
FileInputStream inputStream = new FileInputStream(file);
String postResultToJson = HttpClientHelperUtils.binaryUpload(upload, headerMap, inputStream);
System.out.println(postResultToJson);
}
}
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/48368.html