Создайте файл .csv с помощью веб-службы restful jersey - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь сгенерировать файл .csv в ответ на спокойный веб-сервис (используя Джерси). Пока я могу получить List<HashMap<String, String>>, и ключ должен быть заголовком CSV, а значение должно быть данными CSV.

Я использую API Джексона для генерации CSV.
Поток кода:

  1. Я получаю данные из класса DAO в List<HashMap<String, String>> Название списка myArrList.
    Мое первое сомнение заключается в том, что это хорошая идея, чтобы обеспечить расположение файла, как это в реальном сценарии? Как еще я могу это сделать? Как я могу отправить файл с данными, не создавая файл в локальной системе?

    File file = new File( "C:/Users/.../Downloads/RadioObjectData.csv");
    Writer writer = null;
    ResponseBuilder response = null;
    Reader reader = null;
    
    //Copy List of Map Object into CSV format at specified File location.
    try
    {
         writer = new FileWriter( file, false);
         reader = new FileReader( file);
         csvWriter( myArrList, writer);
         // csvReader( reader);
         response = Response.ok( (Object)file);
         response.header( "Content-Disposition", "attachment; filename=\"RadioObjectData.csv\"");
         // return response.build();
    }
    catch (IOException e)
    {
         // TODO Auto-generated catch block
         e.printStackTrace();
    }
    //Read CSV format from specified File location and print on console..
    return response.build();
    

    и теперь я отправляю этот List методу csvWriter для создания файла .csv в моей системе, чтобы затем я мог отправить этот же файл в ответ на веб-службу. (Этот подход приемлем?)

    public static void csvWriter( List<HashMap<String, String>> listOfMap, Writer writer) throws IOException
    {
      CsvSchema schema = null;
      CsvSchema.Builder schemaBuilder = CsvSchema.builder();
      if (listOfMap != null && !listOfMap.isEmpty())
      {
         for (String col: listOfMap.get( 0).keySet())
         {
            schemaBuilder.addColumn( col);
         }
         schema = schemaBuilder.build().withLineSeparator( "\r").withHeader();
      }
      CsvMapper mapper = new CsvMapper();
      mapper.writer( schema).writeValues( writer).writeAll( listOfMap);
      writer.flush();
    }
    
  2. Теперь файл .csv создается на моем C диске в указанном месте.
    Я хочу, чтобы этот CSV кодировался в base64 перед отправкой в ​​качестве ответа.

Как мне достичь всего этого?

1 Ответ

0 голосов
/ 01 сентября 2018

Просто используйте StreamingOutput в качестве объекта Response.

interface StreamingOutput {
    void write(OutputStream out);
}

Вы просто реализуете этот интерфейс и передаете его методу Response.ok(). В этом случае вы просто оберните OutputStream в OutputStreamWriter, чтобы вы могли передать его методу CsvMapper.writeValues(Writer).

StreamingOutput entity = new StreamingOutput() {
    @Override
    public void write(OutputStream out) {
        Writer writer = new BufferedWriter(
                new OutputStreamWriter(out, StandardCharsets.UTF_8));
        csvWriter(myArrList, writer);
        out.flush();
    }
};
return Response.ok(entity)
        .header(HttpHeaders.CONTENT_DISPOSITION,
                "attachment; filename=\"RadioObjectData.csv\"")
        .build();

Это все, что тебе нужно. Нет необходимости в промежуточном хранении.

Обновление

Если вы хотите, чтобы Base64 кодировал файл CSV, вы можете записать в ByteArrayOutputStream и использовать эти байты для кодирования с классом Base64. После того, как он закодирован, просто запишите закодированные байты в StreamingOutput OutputStream. Вот пример.

StreamingOutput entity = new StreamingOutput() {
    @Override
    public void write(OutputStream out) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        BufferedWriter baosWriter = new BufferedWriter(
                new OutputStreamWriter(baos, StandardCharsets.UTF_8));

        csvWriter(myArrList, baosWriter);
        byte[] bytes = baos.toByteArray();
        byte[] base64Encoded = Base64.getEncoder().encode(bytes);

        out.write(base64Encoded);
        out.flush();
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...