最近使用webservice 做平台接口,SOA那边要求有有文件传输的东西,类型javax.activation.DataHandler
我数据库用的oracle ,类型blob.orm 框架 是hibernate .
文件对应的字段是:
private Blob fileContent;
@Lob
@Column(name = "FILE_CONTENT")
public Blob getFileContent() {
return this.fileContent;
}
转换方法:
先转换成二进制流
InputStream in = 文件对象.getFileContent().getBinaryStream();
然后穿件一个数组,可以一次放入的,当然可以自己优化大小
byte[] buff = new byte[(int) 文件对象.getFileContent().length()];
// 这里我是先写入一个临时文件
File file = new File("../temp_"+文件名)
OutputStream output = new FileOutputStream(file);
BufferedOutputStream bufferedOutput = new BufferedOutputStream(output);
bufferedOutput.write(buff);
// 这里刷进去,不然老写不完。。
bufferedOutput.flush();
这里创建 handdler 对象,当然也可以直接根据路径资源创建。自己看API
DataHandler handler = new DataHandler(new FileDataSource(file));
剩下的事情就是 webservice 传输对象,组织参数什么的了,,,
因为我一次可能多个文件,所以我写的循环,将File 以及Stream 保存起来,然后发送完了之后,在
fially {} 里面进行了 流的关闭,以及临时文件的删除。file.delete() .有更好的方式欢迎提供。
小结:
1. 这个功能比较普通使用,因为只要你拿到文件数据 或者二进制数据,JAVA io 各种流的相互转换这里就不在累赘了。
2.当然如果使用axis,xfire,jws 等东西,我就不确定了,需要尝试。我这里使用是cxf2.3.1 JDK1.6
3.文件传输还要注意 环境以及编码的问题,这个大家做的时候也要注意一下,而且这种传输不宜传大文件,最好别超过10M