java spring download CSV file

| Java Spring | 733 | 955 วันที่แล้ว
วันนี้ผมได้ทำเกี่ยวกับเรื่อง Download Template ไฟล์ของ CSV โดยใช้ Spring โดยไฟล์ Template นั้น มีแค่คอลัมน์เท่านั้น ดังนั้นผมเลยให้ return เป็น OutputStream ออกไปเลย

โดยโค้ดที่ได้เขียนไปนั้น ก็เป็นประมาณนี้

@ResponseBody
@RequestMapping(value = { "/exportlist/{fileId}" }, method = RequestMethod.GET)
public void exportLoadlist(@PathVariable("fileId") Long fileId, HttpServletRequest request, RedirectAttributes redirectAttributes, HttpServletResponse response) throws IOException {
	try {
		final String SPLITCSV = ",";

		response.setContentType("text/plain");
		// Obj obj = null;

		if (Long.valueOf(0).equals(fileId)) {
			response.setHeader("Content-Disposition", "attachment;filename=exportlist.csv");
		} 
		else {
			// for download other file
			// obj = dao.readUploadFile(fileId);
			// response.setHeader("Content-Disposition", "attachment;filename=" + obj.getTranFileName());
		}

		StringBuilder msg = new StringBuilder("COLUMN1,COLUMN2");
		// if (obj != null && obj.getTransactionTemp() != null && !obj.getTransactionTemp().isEmpty()) {
		// 	for (Obj inObj : obj.getTransactionTemp()) {
		// 		msg.append("
");
		// 		msg.append(inObj.getColumn1()));
		// 		msg.append(SPLITCSV);
		// 		msg.append(inObj.getColumn2());
		// 		msg.append(SPLITCSV);
		// 		msg.append(inObj.getInvalidMessage());
		// 	}
		// }
		InputStream input = new ByteArrayInputStream(msg.toString().getBytes("UTF8"));

		int read = 0;
		byte[] bytes = new byte[1024];
		OutputStream os = response.getOutputStream();

		while ((read = input.read(bytes)) != -1) {
			os.write(bytes, 0, read);
		}
		os.flush();
		os.close();
	} catch (Exception ex) {
		LogDebug.get().error(ex);
	}
}
จากโค้ดจะเห็นว่า ให้ทำการยิง GET มาทาง Path /exportlist/{fileId} ซึ่งจะต้องส่ง fileId เข้ามา ถ้าต้องการดาวน์โหลด Template ให้ส่งค่า 0 เข้ามา ส่วนถ้าต้องการดาวน์โหลดไฟล์ข้อมูล ก็ให้ส่ง fileId เข้ามา ใน method จะเซต response ContentType เป็น "text/plain" จากนั้นก็เซต Header Content-Disposition เป็น "attachment;filename=exportlist.csv" โดยให้ชื่อไฟล์ที่ดาวน์โหลดเป็นชื่อ exportlist.csv จากนั้น ก็สร้าง StringBuilder msg เพื่อเก็บข้อมูลในไฟล์ที่จะดาวน์โหลด โดยผมใช้ new StringBuilder("COLUMN1,COLUMN2"); แล้วให้แถวแรกเป็นชื่อข้อมูล COLUMN1 และ COLUMN2 จากนั้นก็นำข้อมูลที่ได้ ไปทำเป็น ByteArrayInputStream จากนั้นก็ ส่งเป็น Stream ทีละ 1024 ไปทาง response
comments

[1]
AGI
58 D
[1]
Adobe-PDF
1162 D
[1]
Android
1053 D
[2]
Angular
36 D
[40]
Animal
1146 D
[1]
Apache
1162 D
[1]
[4]
[2]
[1]
[10]
CMS-Joomla
1163 D
[2]
CMS-SMF
1163 D
[1]
[4]
[1]
[3]
[1]
Database
1162 D
[4]
[1]
DeAI
23 D
[1]
DeData
23 D
[1]
DeFi
23 D
[2]
Docker
53 D
[2]
[1]
Forex
20 D
[1]
Fruit
1147 D
[1]
General
44 D
[2]
Git
949 D
[6]
HTML
53 D
[1]
Health
48 D
[1]
Housework
1151 D
[2]
IT
1143 D
[2]
Imacro
1163 D
[20]
Java
25 D
[1]
Java-Web
1053 D
[2]
[2]
MQL5
975 D
[3]
MakeMoney
948 D
[18]
[1]
[1]
Maven
947 D
[5]
[1]
Mobile
1160 D
[2]
NGINX
36 D
[2]
NodeJs
53 D
[1]
Oracle
53 D
[3]
Physics
944 D
[4]
PugJS
949 D
[2]
React
958 D
[132]
Science
1145 D
[2]
[5]
Spring
36 D
[12]
[7]
[2]
[1]
[4]
Ubuntu
1113 D
[1]
WebLogic
1144 D
[4]