CSV的上传或者后台实现的下载
- 通过SpringMVC中通过MultipartFile对象接收上传的文件
- 读取文件流
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);
}
}
- 导出数据
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 就行了。
后台上传的csv文件希望自动转成有BOM头的,加上这句即可
// 写入bom头,防止excel打开乱码
fw.write(new String(new byte[] { (byte) 0xEF, (byte) 0xBB,(byte) 0xBF }));
前端下载CSV文件
系统前后端分离时,我们通过以下方式实现前端下载CSV文件
- 后台返回字符串数据
- 前端接收数据,创建<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,进行有权限的访问。
说得不对的地方,劳烦留言纠正。如果你有更好的处理方法,也欢迎留言,大家一起进步~~~~