我如何使用spring返回文件而不改变编码,或者只是设置UTF-8-BOM编码



我有一个从数据库读取数据的方法,该数据库以json格式存储来自csv文件的数据。这个方法根据接收到的数据创建一个csv文件。

String fileName = "res/testCreate.csv";
try (BufferedWriter writer = new BufferedWriter (new OutputStreamWriter(new FileOutputStream(fileName), StandardCharsets.UTF_8))) {
String stringPipes = jdbcTemplate.queryForObject("SELECT data from PIPES WHERE pipeName='" + pipeName + "' AND snapshotDate='" + snapshotDate + "'", String.class);
JsonNode jsonTree = new ObjectMapper().readTree(stringPipes);
CsvSchema.Builder builder = CsvSchema.builder();
JsonNode firstObject = jsonTree.elements().next();
firstObject.fieldNames().forEachRemaining(fieldName -> builder.addColumn(fieldName));
CsvSchema csvSchema = builder.build();
CsvMapper csvMapper = new CsvMapper();
writer.write("ufeff");
csvMapper.writerFor(JsonNode.class)
.with(csvSchema.withColumnSeparator(';'))
.writeValue(writer, jsonTree);
} catch (Exception ex) {
throw new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR, "Error");
}

为了用UTF-8-BOM编码保存文件,我写writer.write("ufeff");.

但是我不能将我需要的编码文件传输到请求中,因为编码更改为UTF-8。

我试着用三种方法做这件事。

1:使用ResponseEntity

返回CSV文件
return ResponseEntity.ok()
.header("Content-Disposition", "attachment; filename=" + fileName)
.contentType(MediaType.parseMediaType("text/csv; charset=UTF-8"))
.body(new FileSystemResource(new File(fileName)));

如果我将编码设置为UTF-8,那么文件将带有没有BOM的编码,如果我安装UTF-8-BOM,那么出现一个例外,即不支持这种编码,如果我根本不设置编码,那么设置默认编码,这也不是需要的编码。

2:使用ResponseEntity返回CSV文件

@GetMapping(value = "/getCSVFile")
@ResponseBody
@Operation(summary = "Получение Csv файла", tags = "Трубы. Редактирование")
private ResponseEntity<Resource> getCSVFile() {
Resource resource = new FileSystemResource(new File("res/testCreate.csv"));
return ResponseEntity.ok().header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename="" + resource.getFilename() + """).body(resource);
}

结果是一样的

3:我正在使用HttpServletResponse,我正试图写"ufeff"就像我在方法中做的那样。

@GetMapping(value = "/getCsvWithBOM")
@ResponseStatus(value = HttpStatus.OK)
@Operation(summary = "Получение Csv файла с помощью Pojo", tags = "Трубы. Редактирование")
public void getCsvWithBOM(
@Parameter(description = SW.key) @RequestParam String pipeName,
@Parameter(description = SW.key + "Строка в формате 'yyyy-DD-MM'", example = "2020-01-01") @RequestParam String snapshotDate,
HttpServletResponse response
) {
String fileName = "testCreate.csv";
try {
String stringPipes = jdbcTemplate.queryForObject("SELECT data from PIPES WHERE pipeName='" + pipeName + "' AND snapshotDate='" + snapshotDate + "'", String.class);
JsonNode jsonTree = new ObjectMapper().readTree(stringPipes);
CsvSchema.Builder builder = CsvSchema.builder();
JsonNode firstObject = jsonTree.elements().next();
firstObject.fieldNames().forEachRemaining(fieldName -> builder.addColumn(fieldName));
CsvSchema csvSchema = builder.build();
CsvMapper csvMapper = new CsvMapper();
response.setContentType("text/csv");
response.setHeader("Content-Disposition", String.format("attachment; filename="%s"", fileName));
response.getWriter().write('ufeff');
csvMapper.writerFor(JsonNode.class)
.with(csvSchema.withColumnSeparator(';'))
.writeValue(response.getWriter(), jsonTree);
} catch (Exception ex) {
ex.printStackTrace();
}
}

在本例中,我没有创建文件,而是生成一个要发送的文件。但是该文件仍然带有编码UTF-8,而不是编码UTF-8- bom,尽管我写了response.getWriter().write('ufeff');

  1. bw。写(65279);//utf - 8 BOM인의"EF BB BF"를UTF-16BE로변환
  2. 。子字符串(1);//BOM删除返回。

样本1 .

>         BufferedWriter bw = null;
>         try
>         {
>             bw = new BufferedWriter( new OutputStreamWriter( new FileOutputStream( "out.txt" ) , "UTF-8" ) );
>             bw.write( 65279 ); // UTF-8의 BOM인 "EF BB BF"를 UTF-16BE 로 변환하면
>             bw.write( "ABC가나다라마바사아차카파타하" );
>             bw.newLine( );
>             bw.write( "ㄴㅇㄹㅇㄱ붹가나카깐ㄹ깕" );
>         }
>         catch ( UnsupportedEncodingException e )
>         {
>             e.printStackTrace( );
>         }
  • String lineSeparator = System.getProperty( "line.separator" );
    Writer w = null;
    BufferedReader r = null;
    try
    {
    boolean firstLine = true;
    FileInputStream fis = new FileInputStream( "out.txt" );
    r = new BufferedReader( new InputStreamReader( fis , "UTF-8" ) );
    FileOutputStream fos = new FileOutputStream( "out_cp1252.txt" );
    //w = new BufferedWriter( new OutputStreamWriter( fos , "Cp1252" ) );
    w = new BufferedWriter( new OutputStreamWriter( fos , "MS949" ) );
    String s = null;
    for ( ; ( s = r.readLine( ) ) != null ; )
    {
    if ( firstLine )
    {
    if ( s.startsWith( UTF8_BOM ) )
    {
    s = s.substring( 1 );
    }
    firstLine = false;
    }
    w.write( s + lineSeparator );
    w.flush( );
    }
    }
    catch ( Exception e )
    {
    e.printStackTrace( );
    }
    

    相关内容

    最新更新