场景:
我需要实现的是solr配置文件的自动生成(即本地给了文件和文件名,服务器要获取到文件并按规则生成)
思路
文件生成是考虑直接部署在服务器上,所以写一个java程序用来接受文件,开始创建文件
本地使用http的方式去调用服务器上的java程序,并写入文件
代码
服务器上的jar(生成文件代码)
public static void makeConfig(MultipartFile[] files, String coreName) throws IOException {
File coreHomeFile = new File("/data/engine/solr-7.7.3/server/solr/" + coreName);
File coreConfFile = new File(coreHomeFile + "/conf");
File coreLangFile = new File(coreConfFile + "/lang");
//构建
if (!(coreLangFile.exists())) {
System.out.println("文件不存在开始创建文件夹");
coreLangFile.mkdirs();
}
for (MultipartFile file : files) {
if (Objects.equals(file.getOriginalFilename(), "managed-schema") || Objects.equals(file.getOriginalFilename(), "params.json") || Objects.equals(file.getOriginalFilename(), "protwords.txt") || Objects.equals(file.getOriginalFilename(), "solrconfig.xml") || Objects.equals(file.getOriginalFilename(), "stopwords.txt") || Objects.equals(file.getOriginalFilename(), "synonyms.txt")) {
InputStream inputStream = file.getInputStream();
System.out.println("11:"+coreConfFile + "/" + file.getOriginalFilename());
BufferedOutputStream outputStream = FileUtil.getOutputStream(coreConfFile + "/" + file.getOriginalFilename());
IoUtil.copy(inputStream,outputStream,IoUtil.DEFAULT_BUFFER_SIZE);
}else {
System.out.println("开始下载:"+file.getOriginalFilename());
InputStream inputStream = file.getInputStream();
System.out.println("11:"+coreLangFile + "/" + file.getOriginalFilename());
BufferedOutputStream outputStream = FileUtil.getOutputStream(coreLangFile + "/" + file.getOriginalFilename());
IoUtil.copy(inputStream,outputStream,IoUtil.DEFAULT_BUFFER_SIZE);
}
}
System.out.println("下载完成");
}
@PostMapping("/make")
public void make(@RequestParam("files") MultipartFile[] files, String coreName) throws IOException {
FileUtils.makeConfig(files, coreName);
}
本地代码(访问服务器jar的代码)
@PostMapping("/io")
public void io(@RequestParam MultipartFile[] files, String coreName) throws IOException {
HttpUtils.testGenMakeConfig(files,coreName);
}
public static void testGenMakeConfig(MultipartFile[] files,String coreName) throws IOException {
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
// HttpPost httpPost = new HttpPost("http://localhost:8081/make");
HttpPost httpPost = new HttpPost("http://192.168.*.*:9998/make");
CloseableHttpResponse response = null;
MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create();
for (MultipartFile file : files) {
System.out.println("fileName:"+file.getOriginalFilename());
multipartEntityBuilder.addBinaryBody("files",file.getInputStream(),ContentType.DEFAULT_BINARY,file.getOriginalFilename());
}
ContentType contentType = ContentType.create("text/plain", StandardCharsets.UTF_8);
multipartEntityBuilder.addTextBody("coreName", "test-demo", contentType);
HttpEntity httpEntity = multipartEntityBuilder.build();
httpPost.setEntity(httpEntity);
response = httpClient.execute(httpPost);
HttpEntity responseEntity = response.getEntity();
System.out.println("HTTPS响应状态为:" + response.getStatusLine());
if (responseEntity != null) {
System.out.println("HTTPS响应内容长度为:" + responseEntity.getContentLength());
// 主动设置编码,来防止响应乱码
String responseStr = EntityUtils.toString(responseEntity, StandardCharsets.UTF_8);
System.out.println("HTTPS响应内容为:" + responseStr);
}
}
PS:
multipartEntityBuilder.addBinaryBody(“files”,file.getInputStream(),ContentType.DEFAULT_BINARY,file.getOriginalFilename());
这个方法的后两个参数一定要写,虽然不写不会报错,但是文件在服务器上会接收不到