说说问题在哪:
上传文件到service层以后,file.getInputStream(),这样得到的是字节流,要一行一行的读文件内容,就得转换,然后问题就卡在了这里。
InputStreamReader isw = new InputStreamReader(file.getInputStream(),"gbk");
这样子就可把字节流转换成gbk编码的字符流;
字节流和字符流的差别就是有没有编码方式的存在的,
new InputStreamReader(file.getInputStream(),"gbk");
这个编码格式,就看你上传的文件的格式了,也可是utf-8,也可以是gbk。
然后就是关于顾虑:
csv文件是以逗号隔开的,如果某一行的内容也包含了逗号,这个怎么处理呢,如何正确的取得行数据呢,
我的做法是:要求每一行的逗号个数最多是2,也就是一行是三个元素。如果逗号多了,那么这行数据就不OK,舍弃啦,不处理。
不知道各位还有没有什么更好的处理方式。
先是前台的jsp和iframe
<div class="modal form-horizontal hide ui-draggable" id="uploadAssetActiveStandby" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" style="display: none;">
<div class="modal-header">
<span id="myModalLabel" class="modal-title">上传主备信息</span>
<button type="button" class="close" data-dismiss="modal" aria-hidden="true" οnclick="hideUploadAssetActiveStandbyDialog()">×</button>
</div>
<div class="modal-body">
<form id="uploadAssetActiveStandbyForm" name="uploadAssetActiveStandbyForm" action="" method="POST" enctype="multipart/form-data" target="upLoadAssetActiveStandbyFrame">
<div style="height:30px"></div>
<div class="control-group">
<label class="control-label">上传文件:</label>
<div class="controls">
<input type="file" id="csvActiveStandbyFile" name="csvActiveStandbyFile" value="选择模板 csv 文件" class="input-large" style="width: 250px;">
</div>
</div>
<div style="height:20px"></div>
</form>
</div>
<div class="modal-footer">
<a class="btn btn-success mini" title="确认" οnclick="saveUploadAssetActiveStandby()">确认</a>
<a class="btn btn-light mini" data-dismiss="modal" title="取消" aria-hidden="true" οnclick="hideUploadAssetActiveStandbyDialog()">取消</a>
</div>
</div>
<iframe id="upLoadAssetActiveStandbyFrame" name="upLoadAssetActiveStandbyFrame" style="display:none;">
</iframe>
然后是js代码
/**
* 隐藏上传信息dialog
*/
function hideUploadAssetActiveStandbyDialog() {
$("#uploadAssetActiveStandby").modal("hide");
}
/**
* 上传的csv信息
*/
function saveUploadAssetActiveStandby() {
var $csvActiveStandbyFile = $("#csvActiveStandbyFile");
var csvActiveStandbyFile = $csvActiveStandbyFile.val();
var exp = csvActiveStandbyFile.substring(csvActiveStandbyFile.lastIndexOf("."), csvActiveStandbyFile.length);
if (exp !== ".csv") {
GMS.error("请上传 csv 文件格式", 2000);
return false;
}
try {
GMS.loading("处理中...");
var form = new FormData($( '#uploadAssetActiveStandbyForm')[0]);
$.ajax({
url : SUBSYSTEM_APP_NAME + "assetmanage/uploadAssetActiveStandby",
type : "POST",
data : form,
async:false,
cache:false,
processData:false,
contentType:false,
success : function(data) {
if (data.success) {
$("#uploadAssetActiveStandby").modal("hide");
GMS.success("导入数据OK");
// querySearch();//列表页面重新加载
} else {
GMS.error(data.msg);
}
}
});
} catch (e) {
console.log(e);
}
}
然后是controller的代码
/**
* 上传csv文件
*/
@RequestMapping(value = "uploadAssetActiveStandby", method = RequestMethod.POST)
@ResponseBody
public JsonResult uploadAssetActiveStandby(SessionInfo sessionInfo, HttpServletRequest request) throws IOException {
LOG.debug("---------------AssetController:uploadAssetActiveStandby---------------");
LOG.debug("---------------sessionInfo:\t" + sessionInfo);
LOG.debug("---------------request:\t" + request);
JsonResult result = assetService.uploadAssetActiveStandby(request);
return result.isSuccess()
? new JsonResult(true, result.getMsg(), result.getObj())
: new JsonResult(false, result.getMsg(), result.getObj());
}
然后是service的代码
/**
* 上传主备csv文件
*/
public JsonResult uploadAssetActiveStandby(HttpServletRequest request) {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
if (!multipartResolver.isMultipart(request)) {
return new JsonResult(false, "未包含文件数据流");
}
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
Iterator inter = multiRequest.getFileNames();
Set<String> ipSet = Sets.newHashSet();
while (inter.hasNext()) {
MultipartFile file = multiRequest.getFile((String) inter.next());
String fileName = file.getOriginalFilename();
if (fileName.lastIndexOf(".csv") == -1) {
return new JsonResult(false,"请上传 csv 格式文件");
}
BufferedReader br=null;
InputStreamReader isw = null;
try {
isw = new InputStreamReader(file.getInputStream(),"gbk");
br = new BufferedReader(isw);
String line;
while ((line = br.readLine()) != null) {
String[] lineData = line.split(",");
if(lineData.length > 3){
continue;//当有异常数据的时候,即一行逗号查过2个。
}
ipSet.add(lineData[0]);
}
} catch (Exception e) {
LOG.error("上传文件异常" + e.getMessage());
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
LOG.error("关闭文件异常" + e.getMessage());
}
}
if (isw != null) {
try {
isw.close();
} catch (IOException e) {
LOG.error("关闭文件异常" + e.getMessage());
}
}
}
}
System.out.println(ipSet);
return new JsonResult(true, "上传更新成功");
}