首先,文件导出不需要前端做操作,只需格式对上即可,建议前端请求采用form表单请求,
即:Content-Type=application/x-www-form-urlencoded
下面主要记录了使用CsvWriter工具类写csv文件,并且解决文件名乱码、文件内容乱码等问题,但是该方法是为了http请求设计,故不能通过运行验证。但是代码已通过验证,可以参考:
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import com.csvreader.CsvWriter;
/**
* csv导出
* @author xiaowei 2018年5月15日 上午11:35:42
*/
public class CsvExport {
public void exportCsv(HttpServletResponse response) {
// 1、获取待写入信息
// 获取csv第一行
String[] headers = new String[] { "第一列", "第二列" };
// 获取行记录list
List<String[]> recordList = new ArrayList<>();
try {
// 2、设置HttpServletResponse相关信息
// 文件名前缀
String namePrefix = "csvExport测试";
// 注意,response这些格式设置,必须在设置下面response流相关操作之前,否则会指定默认的格式编码。也就是说之后设置会无效
// 设置自动下载及文件名等信息,URLEncoder是为了解决文件名中文乱码问题
response.setContentType("application/csv;charset=utf-8");
response.setHeader("Content-Disposition",
"attachment;filename=" + URLEncoder.encode(namePrefix + ".csv", "UTF-8"));
// 3、将记录写入临时csv文件
// 创建临时文件,不关心文件路径
File tempFile = File.createTempFile(namePrefix, ".csv");
CsvWriter csvWriter = new CsvWriter(tempFile.getCanonicalPath(), ',',
Charset.forName("UTF-8"));
// 写表头,实际上就是写第一行
csvWriter.writeRecord(headers);
// 写正文内容
for (String[] record : recordList) {
csvWriter.writeRecord(record);
}
csvWriter.close();
// 4、将文件写入response
InputStream in = new FileInputStream(tempFile);
OutputStream out = response.getOutputStream();
int n = 0;
byte[] buffer = new byte[1024];
while ((n = in.read(buffer)) > 0) {
// 加上BOM标识,否则会乱码,微软的锅[摊手][摊手]
out.write(new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF });
out.write(buffer, 0, n);
}
out.close();
in.close();
} catch (IOException e) {
// FIXME 通常可以抛出系统业务异常等自定义操作
}
}
}