最近自己负责的系统平台(后面统称为:平台A)和网段内另外一个服务系统(后面统称为:平台B)产生了很多数据交互。平台B以WebService服务为主,客户端程序用Soap封装相关的操作类形成解析流程,最后提供出来外层接口给平台A的应用程序调用。
对于平台B传输过来的文件数据,最终通过接口方法得到的标准的字节输入流InputStream,刚开始想复杂了,想把流写到文件中然后存储在服务器本地,然后在去取服务器的文件,最后再存储到平台A文件服务器。
后来思考了半天,发现只需要把流写入内存文件载体即可直接针对内存进行文件服务器的存储,于是通过观察平台A文件服务器提供的接口,得到了最终的解决方案,如下:将输入流转换为MultipartFile,然后在进行相关文件属性的组织和存储即可。
代码如下:
public static MultipartFile getMultipartFile(InputStream inputStream,String fileName) {
FileItem fileItem = createFileItem(inputStream,fileName);
return new CommonsMultipartFile(fileItem);
}
public static FileItem createFileItem(InputStream inputStream,String fileName) {
FileItemFactory factory = new DiskFileItemFactory(16,null);
String textFieldName = "file";
FileItem item = factory.createItem(textFieldName, MediaType.MULTIPART_FORM_DATA_VALUE,true,fileName);
int bytesRead = 0;
byte[] buffer = new byte[10 * 1024 * 1024];
OutputStream os = null;
try {
os = item.getOutputStream();
while ((bytesRead = inputStream.read(buffer,0,8192)) != -1) {
os.write(buffer,0,bytesRead);
}
inputStream.close();
} catch (IOException e) {
logger.info("stream copy exception",e);
throw new IllegalArgumentException("文件上传失败");
} finally {
if (os != null) {
try {
os.close();
} catch (IOException e1) {
logger.info("stream copy exception",e1);
}
}
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e2) {
logger.info("stream copy exception",e2);
}
}
}
return item;
}
代码说明:
- FileItem为文件上传jar包中的常用底层接口。
- FileItemFactory和DiskFileItemFactor也是文件上传jar包中的工厂接口。
- CommonsMultipartFile为Spring框架中实现了MultipartFile接口的实现类。