CSV文件的上传下载及遇到的常见问题

3 篇文章 0 订阅

CSV的上传或者后台实现的下载

  1. 通过SpringMVC中通过MultipartFile对象接收上传的文件
  2. 读取文件流
BufferedInputStream bufferIn = new BufferedInputStream(file.getInputStream());
BufferedReader bufferReader = new BufferedReader(new InputStreamReader(bufferIn, encoding));
List<String[]> fileData = Lists.newArrayList();
while (null != (line = bufferReader.readLine())) {
	if (StringUtils.isNotBlank(line)) {
		String[] split = line.split(",");
		fileData.add(split);
	}
}
  1. 导出数据
FileWriterWithEncoding fw = new FileWriterWithEncoding(filePath, Charset.forName("UTF-8"), true);
// 写入bom头,防止excel打开乱码
fw.write(new String(new byte[] { (byte) 0xEF, (byte) 0xBB,(byte) 0xBF }));
CSVWriter csvWriter = new CSVWriter(fw, ',',CSVWriter.NO_ESCAPE_CHARACTER); 
csvWriter.writeAll(csvData);
fw.close();
csvWriter.close();

注意这里使用了很麻烦啰嗦间接的方式,进行上传文件。
SpringMvc的上传文件,一般采用 transferTo(File dest)

File file = new File(filePath);
if (file.exists()) {
	file.delete();
}
updateFile.transferTo(file);

但是这样子上传的CSV文件,原文件的编码格式是什么,上传的文件就是什么。
如果上传的csv文件是UTF-8无BOM的编码格式,用notepad++打开是正常的,但excel打开会出现中文乱码,因为Excel 支持的编码格式基本和文本文档支持的一致(UTF-8 with BOM 和 GB2312)首选 UTF-8 with BOM,我们只要把.csv文件的编码格式转换成UTF-8 with BOM 就行了。
notepad++改变文件编码格式

后台上传的csv文件希望自动转成有BOM头的,加上这句即可

// 写入bom头,防止excel打开乱码
fw.write(new String(new byte[] { (byte) 0xEF, (byte) 0xBB,(byte) 0xBF }));

前端下载CSV文件

系统前后端分离时,我们通过以下方式实现前端下载CSV文件

  1. 后台返回字符串数据
  2. 前端接收数据,创建<a>标签,绑定下载URL对象,点击
 // 在response.data前面加\ufeff是为了表示编码格式为UTF-8,否则导出的文件中文会乱码
let url = window.URL.createObjectURL(
  new Blob(['\ufeff' + response.data])
)
let link = document.createElement('a')
link.style.display = 'none'
link.href = url
link.setAttribute('download', decodeURIComponent(response.headers.exportfilename))
link.click()
window.URL.revokeObjectURL(url)

ps: decodeURIComponent() 函数可对 encodeURIComponent() 函数编码的 URI 进行解码
后台的文件名做了一下操作

// 把下载显示的文件名编码设置为utf-8
exportfilename= java.net.URLEncoder.encode(exportfilename, "UTF-8");

以上实现方法等效于

<a :href="apiPath.downloadCsvApi" download="true">导出文件.csv</a>

之所以使用以上方法请求,是因为a标签超链接的请求方式在axios无法拦截,而后台的请求需要设置token,进行有权限的访问。

说得不对的地方,劳烦留言纠正。如果你有更好的处理方法,也欢迎留言,大家一起进步~~~~

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值