2014-02-19 3 views
2

Используя OpenCSV, я могу успешно создать CSV-файл на диске, но мне действительно нужно разрешить пользователям загружать CSV с помощью кнопки загрузки, мне не нужно сохранять на диске, просто скачайте , Есть идеи?Загрузить CSV-файл через Rest

@GET 
@Path("/downloadCsv") 
public Object downloadCsv() { 
     CSVWriter writer; 
     FileWriter wr; 
     //Or should I use outputstream here? 
     wr= new FileWriter("MyFile.csv"); 
     writer = new CSVWriter(wr,','); 
     for (Asset elem: assets) { 
      writer.writeNext(elem.toStringArray()); 
     } 
     writer.close(); 


} 

EDIT: Я не хочу, чтобы сохранить/прочитать файл на диске EVER

ответ

8

Чтобы принудительно «сохранить как», вам нужно установить HTTP-заголовок содержимого в ответе. Это должно выглядеть так:

Content-Disposition: attachment; filename="whatever.csv" 

Похоже, вы используете JAX-RS. В этом question показано, как установить заголовок. Вы можете написать CSV в поток ответа HTTP и установить заголовок там или возвращать Response объект как так:

return Response.ok(myCsvText).header("Content-Disposition", "attachment; filename=" + fileName).build(); 

Вам не нужно писать в File объект в середине этого процесса, поэтому можно избежать запись на диск.

+1

Я обновил свой ответ. Один простой способ - получить строку из CSVWriter. Я использую JacksonCSV не OpenCSV, но я думаю, что это довольно легко. Например, вы можете использовать StringWriter вместо FileWriter. – tom

+1

Yup. Просто напишите его в строку, а не в файл. Возвращение ответа не объекта. Попробуйте. – tom

3

Во-первых, код не может быть скомпилирован, верно? Метод downloadCsv() объявляет тип возврата Object, но ничего не возвращает.

Я бы сменил объявление на String downloadCsv() и вернул содержимое CSV в качестве строки. Для этого используйте StringWriter вместо FileWriter, а затем скажите return wr.toString().

Единственное, что здесь отсутствует, это тип контента. Вы комментируете свой метод как @Produces({"text/csv"}).

думаю, все.

+0

если я верну строку, пользователь получит диалоговое окно сохранения/открытия браузера? thats what i need – Spring

+0

Это зависит от конфигурации и типа браузера пользователя. Но возвращаемый тип метода не влияет на этот процесс. Тип содержимого делает. – AlexR

+0

tnx это будет IE8 – Spring

1
  response.setHeader("Content-Disposition", "attachment; filename=" + filename + ".csv"); 
      response.setContentType("text/csv"); 
      OutputStreamWriter osw = new OutputStreamWriter(response.getOutputStream(), "UTF-8"); 

      List<String[]> result = iSmsExportService.csvExport(columnNames); 
      CSVWriter csvWriter = new CSVWriter(osw, ';'); 
      csvWriter.writeAll(result); 
      csvWriter.flush(); 
      csvWriter.close(); 

Это сработало для меня. После этого загрузился файл CSV.

Смежные вопросы