복붙노트

[SPRING] Spring Controller에서 브라우저의 CSV 데이터를 반환하는 방법

SPRING

Spring 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. ==============================

    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. ==============================

    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. ==============================

    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();
        }
    }
    
  4. from https://stackoverflow.com/questions/22947751/how-to-return-csv-data-in-browser-from-spring-controller by cc-by-sa and MIT license