为什么需要跨系统传输
在开发过程中,总会遇到文件上传的问题,一个公司里的系统有好多个,然而文件上传配置的话也很麻烦,如果使用了minio系统创造桶来存储文件,虽然每一个系统都创建一个桶来存储也很方便,但是每个系统都要配置上minio系统也是一个很庞大的工作量,这个时候就想着能不能系统在需要文件上传等文件操作功能的时候在后端直接调用配置了minio工具的系统,将相当于多发送一个请求,如果在网络稳定的情况下应该没问题(注意速度会变慢,而且第一次建立链接时时间会很长,建立完链接速度会提上来,这就引出了另一个原因,就是线程数,持有minio的系统会创建线程,给该系统代带来了很大的性能消耗!)
然而公司内部都会有一个公司的erp!所以无论是从使用量还是并发情况来看对文件操作的压力都不是很大!
所以上代码:
/**
* 跨系统批量查询文件
* @param fileId
* @return
* @throws IOException
* @throws URISyntaxException
*/
@GetMapping(value = "/fileListByFileId/{fileId}")
public AjaxResult getFileListByFileId(@PathVariable("fileId") String fileId) throws IOException, URISyntaxException {
String apiUrl = "http://www.baidu.com/file/"; // 目标系统的API端点URL
apiUrl = apiUrl+fileId;
// 定义请求的参数
// URI apiUrl = new URIBuilder("http://file.yuyouship.top/file/{fileId}")
// .setParameter("fileId",fileId)
// .setParameter("page", "1")
// .setParameter("rows", "10")
// .build();
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(apiUrl);
// 执行HTTP请求
HttpResponse response = httpClient.execute(httpGet);
// 处理响应
int statusCode = response.getStatusLine().getStatusCode();
String responseBody = null;
if (statusCode == 200) {
// 从响应实体获取响应内容
responseBody = EntityUtils.toString(response.getEntity());
// 处理响应内容,这里假设返回的是JSON数据
System.out.println("列表数据获取成功!");
System.out.println("响应内容: " + responseBody);
} else {
System.out.println("列表数据获取失败,HTTP响应码: " + statusCode);
System.out.println("错误响应: " + EntityUtils.toString(response.getEntity()));
}
return success(responseBody);
}
/**
* 跨系统上传图片
* @param file
* @return
* @throws IOException
*/
@PostMapping(value = "/addFile")
public AjaxResult addFile(@RequestParam("file") MultipartFile file) throws IOException {
String url = "http://www.baidu.com/file/upload";
File file1 = MultipartFileToFileUtil.multipartFileToFile(file);
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(url);
// 创建一个多部分实体构建器
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.addBinaryBody("file", file1);
// 将构建的实体设置为HttpPost请求的实体
HttpEntity multipartEntity = builder.build();
httpPost.setEntity(multipartEntity);
// 执行HTTP请求
HttpResponse response = httpClient.execute(httpPost);
// 处理响应
int statusCode = response.getStatusLine().getStatusCode();
String responseBody = EntityUtils.toString(response.getEntity());
if (statusCode == 200) {
System.out.println("文件上传成功!");
System.out.println("响应内容: " + responseBody);
} else {
System.out.println("文件上传失败,HTTP响应码: " + statusCode);
System.out.println("错误响应: " + responseBody);
}
return success(responseBody);
}
主要使用HttpClients包的方法(阿里巴巴的开发社区也有关于这个解释,而且解释得很清楚!)
其他的jar包,使用idea里都是可以意见导入的!
其中有个小问题,前端传过来的文件都是MultipartFile类型!
然而
builder.addBinaryBody(“file”, file1);
中的file1的类型是File的所以这里需要有一个MultipartFile转File的工具类
这里提供一下:
/**
* 文件转换工具类
*
* @author henshuia
* @date 2020-07-23
*/
public class MultipartFileToFileUtil {
/**
* MultipartFile 转 File
*
* @param file
* @throws Exception
*/
public static File multipartFileToFile(MultipartFile file) {
try {
File toFile;
if (file != null && file.getSize() > 0) {
InputStream ins = null;
ins = file.getInputStream();
toFile = new File(file.getOriginalFilename());
inputStreamToFile(ins, toFile);
ins.close();
return toFile;
}
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
/**
* 获取流文件
*
* @param ins
* @param file
*/
public static void inputStreamToFile(InputStream ins, File file) {
try {
OutputStream os = new FileOutputStream(file);
int bytesRead;
byte[] buffer = new byte[8192];
while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
ins.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 删除本地临时文件
*
* @param file
*/
public static void deleteTempFile(File file) {
if (file != null) {
File del = new File(file.toURI());
del.delete();
}
}
}
这个文件来源MultipartFile转File
这是个需求解决了!看截图
咱们下个bug见!