java spring download CSV file

| Java Spring | 325 | 492 วันที่แล้ว
วันนี้ผมได้ทำเกี่ยวกับเรื่อง 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]
Adobe-PDF
700 D
[1]
Android
591 D
[40]
Animal
684 D
[1]
Apache
700 D
[2]
[10]
[2]
CMS-SMF
701 D
[1]
[3]
[1]
Database
700 D
[4]
[1]
Docker
595 D
[1]
Fruit
684 D
[2]
Git
487 D
[5]
HTML
487 D
[1]
Housework
689 D
[2]
IT
681 D
[2]
Imacro
701 D
[17]
Java
484 D
[1]
Java-Web
591 D
[1]
[2]
MQL5
513 D
[3]
MakeMoney
486 D
[18]
[1]
Maven
485 D
[1]
Mobile
698 D
[1]
NodeJs
486 D
[3]
Physics
482 D
[4]
PugJS
486 D
[2]
React
496 D
[132]
Science
683 D
[1]
[2]
Spring
485 D
[7]
[2]
[1]
[4]
Ubuntu
650 D
[1]
WebLogic
682 D
[4]