保存流对象(输入流在第二次使用的时候会失效),在需要用到InputStream的地方再将字节数组转化字节流使用,如果只需要用到一次inputstream流,就不用这样啦,直接用就OK。
下面直接上代码:
/**
* 保存流对象(输入流在第二次使用的时候会失效)
* 在需要用到InputStream的地方再封装成InputStream
* ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(buf);
* Workbook wb = new HSSFWorkbook(byteArrayInputStream);//byteArrayInputStream 继承了InputStream,故这样用并没有问题
* 如果只需要用到一次inputstream流,就不用这样啦,直接用就OK
* @param ins
*/
public byte[] saveaIns(InputStream ins){
byte[] buf = null;
try {
if(ins!=null){
buf = org.apache.commons.io.IOUtils.toByteArray(ins);//ins为InputStream流
}
} catch (IOException e) {
e.printStackTrace();
}
return buf;
}
/**
* 保存导入的SMS信息(需要对信息进行检验)
* @return
*/
public void saveImportData(){
try{
byte[] excelByte = null;//保存excel二进制流数据
//从httpRequest中得到上载的文件对象
Object[] o = VVMappingUtil.populateByMutilpartRequest(this.getRequest());
FileItem fileItem = (FileItem)o[0]; //只有一个上载文件
HashMapparams = new HashMap();//记录文件中的orgname,用来检验文件中是否存在重复的记录
params.put("version", "2003");//excel版本 为 2003
HashMapsmsnames = getAllName();//获取所有厂商名称(key:组织名称 value:id)
params.put("smsnames", JSONObject.fromObject(smsnames).toString());//数据库中的组织名称
//object是List>类型
ListsettleobjsInfo = null;
ExcelInfo info = null;
try{
//解析并校验excel内容
info = this.getExcelParams(fileItem);
excelByte = saveaIns(info.getIns());//用字节数组保存流对象(输入流在第二次使用的时候会失效)
info.setIns(new ByteArrayInputStream(excelByte));
//判断Excel是否为两页
if(!sheetnumIsOk(new ByteArrayInputStream(excelByte))){
returnMsg.put("reason", true);
returnMsg.put("msg", "上传的Excel应只有两页!");
this.writeRsp(VVMappingUtil.makeSuccessRsp(JSONObject.fromObject(returnMsg).toString())); return;
}
//判断是否存在异常列,若存在则删除
if(hasCheckColumn(fileItem,info)){
removeCkColumn(fileItem,info);
}
//判断sheet页中是否存在必要信息列
if(!sheetcolIsOk(new ByteArrayInputStream(excelByte))){
returnMsg.put("reason", true);
returnMsg.put("msg", "必要信息列不能修改或删除!");
this.writeRsp(VVMappingUtil.makeSuccessRsp(JSONObject.fromObject(returnMsg).toString())); return;
}
//判断Excel的sheet页名称是否为:发送账号列表,短信信息列表
if(!sheetnameIsOk(new ByteArrayInputStream(excelByte))){
returnMsg.put("reason", true);
returnMsg.put("msg", "上传的Excel的sheet页名称应为发送账号列表,短信信息列表!");
this.writeRsp(VVMappingUtil.makeSuccessRsp(JSONObject.fromObject(returnMsg).toString())); return;
}
HashMapsmsExcelNames = getExcelAllName(new ByteArrayInputStream(excelByte));//获取所有《账号发送列表》中的厂商名称(key:组织名称 value:id)
params.put("smsExcelNames", JSONObject.fromObject(smsExcelNames).toString());//《账号发送列表》中的组织名称
settleobjsInfo = (List) util.ExcelRecolve(info, params, smsbiz);
}catch(Exception ex){//捕获解析excel过程中的异常信息,反馈给前台,并终止导入操作
this.writeRsp(VVMappingUtil.makeFailureRsp(ex.getMessage()));
return;
}
if(settleobjsInfo != null && settleobjsInfo.size() > 0){
//判断是否有错误信息,如果有,则不保存并且将文件返回前台一个链接地址
for(int i=0;i> data = (List>) settleobjsInfo.get(i);
int voLen = info.getSheetinfo()[i].getVoName().length;
int len = data.size();
for(int j=0;j
上面发送短信的业务代码,需要多次用到文件流,保存文件流的具体实现就是saveaIns方法了。