gpt4 book ai didi

csv - 使用 jersey restful webservice 生成 .csv 文件

转载 作者:行者123 更新时间:2023-12-04 19:20:04 25 4
gpt4 key购买 nike

我正在尝试生成 .csv文件作为对 restful web 服务的响应(使用 Jersey)。到目前为止,我能够得到 List<HashMap<String, String>>键应该是 CSV header ,值应该是 CSV 数据。

我正在使用 Jackson API 生成 CSV。
代码流程是:

  1. 我从 List<HashMap<String, String>> 中的 DAO 类获取数据列表的名称是 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();

    现在我发送这个ListcsvWriter创建 .csv 的方法我的系统中的文件,这样我就可以发送相同的文件作为对 web 服务的响应。(这种方法可以吗?)

    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 编码。

我怎样才能实现这一切?

最佳答案

只需使用 StreamingOutput作为 Response 实体。

interface StreamingOutput {
void write(OutputStream out);
}

您只需实现此接口(interface)并将其传递给 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();

这就是您所需要的。无需任何中间存储。

更新

如果您想对 CSV 文件进行 Base64 编码,您可以写入 ByteArrayOutputStream 并使用这些字节通过 Base64 进行编码类(class)。编码后,将编码后的字节写入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();
}
};

关于csv - 使用 jersey restful webservice 生成 .csv 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52118550/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com