1、使用场景:远程文档服务器,给定接口,请求参数格式等信息,系统根据配置的路径及后缀,获取指定类型的文件,在应用中上传文件/图片到服务器中。然后将成功的返回结果信息中的fileId内容保存到数据库中,删除对应的文件。
响应结果示例:
2、应用方法:创建HttpClient 来实现 httpPost 方式访问文档服务器,发送上传请求上传文件。
执行上传的基本操作:
a. 通过HttpClients.createDefault()方法,创建httpClient对象;
b. 根据URL通过new HttpPost(url) 方式,创建httpPost对象;
c. MultipartEntityBuilder.create()方法,创建multipartEntityBuilder对象;
d. 给multipartEntityBuilder对象设置必要的参数(重要:addBinaryBody("file", file)),这里第一个参数只能是“file”;
e. 给multipartEntityBuilder对象设置其他附加的请求参数,使用addTextBody(paramName, paramContent, paramContentType);
f. 调用multipartEntityBuilder对象的build()方法,转换成Http'Entity类型,传入httpPost.setEntity()方法中;
g. 传入httpPost对象,调用httpClient.excute(httpPost)方法,执行上传操作;
上传代码示例如下:
/**
* 上传执行
*
* @param file
* @param params
* @return String
*/
private String uploadExecute(File file, Map params) {
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(postUrl);
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(200000).setSocketTimeout(200000000).build();
String result = null;
HttpResponse response = null;
MultipartEntityBuilder mEntityBuilder = MultipartEntityBuilder.create();
mEntityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
mEntityBuilder.addBinaryBody("file", file);
// 设置其他参数
for (Map.Entry entry : params.entrySet()) {
mEntityBuilder.addTextBody(entry.getKey(), entry.getValue(), ContentType.TEXT_PLAIN.withCharset("UTF-8"));
}
httpPost.setConfig(requestConfig);
httpPost.setEntity(mEntityBuilder.build());
try {
response = httpClient.execute(httpPost);
int statusCode = response.getStatusLine().getStatusCode();
//上传成功,返回结果
if (statusCode == HttpStatus.SC_OK) {
log.info("名称为:{} 的文件上传成功", file.getName());
HttpEntity resEntity = response.getEntity();
result = EntityUtils.toString(resEntity);
// 消耗掉response
EntityUtils.consume(resEntity);
} else {
log.info("名称为:{} 的文件上传失败", file.getName());
log.info("上传失败原因为:{}", EntityUtils.toString(response.getEntity()));
}
} catch (IOException e) {
log.error("上传文件发生异常:{}", e);
} finally {
HttpClientUtils.closeQuietly(httpClient);
HttpClientUtils.closeQuietly(response);
}
return result;
}
根据配置路径及后缀获取指定类型文件的代码示例如下:
/**
* 获取目录下指定类型文件
*
* @return List
*/
private List uploadBefore(String filePath) {
log.info("当前任务获取文件的路径为:{}", filePath);
List list = new ArrayList<>();
File curPath = new File(filePath);
File[] files = curPath.listFiles();
if (files == null || files.length == 0) {
log.info("该路径下没有任何文件");
return Collections.emptyList();
}
String[] suffixes = suffix.split(",");
for (String curSuffix : suffixes) {
log.info("获取后缀为:{} 的目标文件", "." + curSuffix);
for (File file : files) {
if (file.getName().endsWith("." + curSuffix)) {
log.info("获取到目标文件:{}", file.getName());
list.add(file);
}
}
log.info("获取到的目标文件数量为:{}", list.size());
}
return list;
}
根据文件后缀,从文件名中获取表名的代码如下:
/**
* 根据文件名解析表名称
*
* @author liwenqiang 2019/2/14 11:20
**/
public class AnalysisTableNameUtil {
public static String getTableName(String fileName) {
String tableName = null;
if (fileName.endsWith(".zip")) {
//截取_之前的内容
tableName = StringUtils.substringBeforeLast(fileName, "_");
} else if (fileName.endsWith(".xls") || fileName.endsWith(".xlsx")) {
//截取第一个数字之前的内容
Pattern p = Pattern.compile("([0-9])");
Matcher matcher = p.matcher(fileName);
if (matcher.find()) {
int index = fileName.indexOf(matcher.group());
tableName = fileName.substring(0, index);
}
}
return tableName;
}
}