[SPRING] Spring Controller에서 브라우저의 CSV 데이터를 반환하는 방법
SPRINGSpring Controller에서 브라우저의 CSV 데이터를 반환하는 방법
내가 CSV 데이터를 문자열로 가지고 있고 스프링 컨트롤러에서 반환하려고한다고 가정 해 보겠습니다. 데이터가 다음과 같이 생겼다고 상상해보십시오.
a,b,c
1,2,3
4,5,6
내가 시도한 것에 상관없이, 개행 문자는 응답 내용에서 문자 그대로 '\ n'으로 나오고, "\ n"처럼 두 문자를 이스케이프하면 응답은 이중 백 슬래시도 포함합니다. 일반적으로 개행을 수정하지 않고도 개행 문자가있는 일반 텍스트 데이터를 반환하는 방법은 무엇입니까? 나는 일반 텍스트를 반환하는 방법을 알고 있지만 여전히 내용은 이스케이프 된 줄 바꿈과 함께 제공됩니다 ... 이것은 내가 현재 가지고있는 것입니다 (선택하지 않아서 Spring 3.0.5 사용).
@RequestMapping(value = "/api/foo.csv")
public ResponseEntity<String> fooAsCSV() {
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.add("Content-Type", "text/plain; charset=utf-8");
String data = "a,b,c\n1,2,3\n3,4,5";
return new ResponseEntity<>(data, responseHeaders, HttpStatus.OK);
}
문자 그대로 문자열을 생성합니다.
"a,b,c\n1,2,3\n,3,4,5"
브라우저에서. 어떻게 위의 그림과 같이 새로운 줄이있는 정확한 데이터를 만들 수 있습니까?
해결법
-
==============================
1.예를 들어를 사용하여 직접 응답에 쓸 수 있습니다.
예를 들어를 사용하여 직접 응답에 쓸 수 있습니다.
@RequestMapping(value = "/api/foo.csv") public void fooAsCSV(HttpServletResponse response) { response.setContentType("text/plain; charset=utf-8"); response.getWriter().print("a,b,c\n1,2,3\n3,4,5"); }
반환 유형이 무효이고 HttpServletResponse가 메소드 인수로 선언되었으므로이 메소드가 반환 될 때 요청이 완료된 것으로 간주됩니다.
-
==============================
2.컨트롤러 메소드에서 @ResponseBody를 시도해 보셨습니까?
컨트롤러 메소드에서 @ResponseBody를 시도해 보셨습니까?
@RequestMapping(value = "/api/foo.csv") @ResponseBody public String fooAsCSV(HttpServletResponse response) { response.setContentType("text/plain; charset=utf-8"); String data = "a,b,c\n1,2,3\n3,4,5"; return data; }
편집 : 스프링 문서 여기에 설명 : http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-ann-responsebody
-
==============================
3.라이브러리 supercsv를 사용할 수 있습니다.
라이브러리 supercsv를 사용할 수 있습니다.
<dependency> <groupId>net.sf.supercsv</groupId> <artifactId>super-csv</artifactId> <version>2.1.0</version> </dependency>
사용 방법은 다음과 같습니다.
1- csv로 쓰고 싶은 모델 클래스를 정의하십시오.
public class Book { private String title; private String description; private String author; private String publisher; private String isbn; private String publishedDate; private float price; public Book() { } public Book(String title, String description, String author, String publisher, String isbn, String publishedDate, float price) { this.title = title; this.description = description; this.author = author; this.publisher = publisher; this.isbn = isbn; this.publishedDate = publishedDate; this.price = price; } // getters and setters... }
2- 다음과 같은 마술을하십시오 :
import java.io.IOException; import java.util.Arrays; import java.util.List; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.supercsv.io.CsvBeanWriter; import org.supercsv.io.ICsvBeanWriter; import org.supercsv.prefs.CsvPreference; /** * This Spring controller class implements a CSV file download functionality. * */ @Controller public class CSVFileDownloadController { @RequestMapping(value = "/downloadCSV") public void downloadCSV(HttpServletResponse response) throws IOException { String csvFileName = "books.csv"; response.setContentType("text/csv"); // creates mock data String headerKey = "Content-Disposition"; String headerValue = String.format("attachment; filename=\"%s\"", csvFileName); response.setHeader(headerKey, headerValue); Book book1 = new Book("Effective Java", "Java Best Practices", "Joshua Bloch", "Addision-Wesley", "0321356683", "05/08/2008", 38); Book book2 = new Book("Head First Java", "Java for Beginners", "Kathy Sierra & Bert Bates", "O'Reilly Media", "0321356683", "02/09/2005", 30); Book book3 = new Book("Thinking in Java", "Java Core In-depth", "Bruce Eckel", "Prentice Hall", "0131872486", "02/26/2006", 45); Book book4 = new Book("Java Generics and Collections", "Comprehensive guide to generics and collections", "Naftalin & Philip Wadler", "O'Reilly Media", "0596527756", "10/24/2006", 27); List<Book> listBooks = Arrays.asList(book1, book2, book3, book4); // uses the Super CSV API to generate CSV data from the model data ICsvBeanWriter csvWriter = new CsvBeanWriter(response.getWriter(), CsvPreference.STANDARD_PREFERENCE); String[] header = { "Title", "Description", "Author", "Publisher", "isbn", "PublishedDate", "Price" }; csvWriter.writeHeader(header); for (Book aBook : listBooks) { csvWriter.write(aBook, header); } csvWriter.close(); } }
from https://stackoverflow.com/questions/22947751/how-to-return-csv-data-in-browser-from-spring-controller by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] javacfig에서 'springSecurityFilterChain'이라는 Bean이 정의되지 않았습니다. (0) | 2019.02.11 |
---|---|
[SPRING] MaxUploadSizeExceededException은 Spring에서 예외 처리 메소드를 호출하지 않습니다. (0) | 2019.02.10 |
[SPRING] MongoDB와의 ZonedDateTime (0) | 2019.02.10 |
[SPRING] 봄 부팅시 사용자 정의 변환기를 등록하는 방법은 무엇입니까? (0) | 2019.02.10 |
[SPRING] ScopedProxy는 사용할 세션을 어떻게 결정합니까? (0) | 2019.02.10 |