Java读csv文件,结合iframe上传csv文件,解决乱码问题

说说问题在哪:
上传文件到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, "上传更新成功");
	}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值