ByteArrayOutputStream-使用特殊字符错误生成的条目



我正在使用ByteArrayOutputStream和ZipOutputStream生成一个zip文件。ZipEntry中的文件名可以使用正确的编码。当它被称为";ByteArrayOutputStream.toByteArray(("并且zip文件被正确地创建,但是zipEntries是在";cp866";。在控制器处,返回类型是ResponseEntity<byte[]>。

下面是代码的一部分。

byteArrayOutputStream = new ByteArrayOutputStream();
zipOutputStream = new ZipOutputStream(byteArrayOutputStream);
zipOutputStream.putNextEntry(new ZipEntry("ação.pdf")); //Here it is all OK
zipOutputStream.write(inputStream.readAllBytes());
zipOutputStream.closeEntry();

返回到RestController的代码类似于:

HttpHeaders headers = new HttpHeaders();
contentDisposition =
ContentDisposition.builder("attachment").filename("download.zip").build();
headers.setContentDisposition(contentDisposition);
headers.setContentLength(byteArrayOutputStream.size());
headers.setContentType(MediaType.parseMediaType("application/zip; charset-utf-8"));
return ResponseEntity.ok().headers(headers).body(byteArrayOutputStream.toByteArray());

在这种情况下;ação.pdf;被生成为";一├з├Γo.pdf";,如果我在ZipEntry指定字符集ISO8859-1;aчуo.pdf";。

我尝试过的:

  • 返回StreamingResponseBody(而不是byte[](
  • 在zipEntry文件名字符串中指定字符集
  • 在zipEntry对象处指定字符集
  • convert do base64(生成的文件已损坏(

在所有可能的中都没有成功

解决方案:使用正确的ZipOutputStream构造函数,该构造函数同时接受OutputStream编码。

旁注:你有一个打字错误。此:

headers.setContentType(MediaType.parseMediaType("application/zip; charset-utf-8"));

不正确。它是charset=utf-8。注意等号。但是,这也不正确。ZIP文件没有字符集编码。它是二进制数据。JPG文件也并没有一个,原因也是一样的。正确的mime类型只是application/zip,没有其他内容。

完整解释

不能用mime头传递zip文件中项的字符集编码。它被编码在zip文件本身中。

因此,将其编码在zip文件中。这很容易做到!

new ZipOutputStream(byteArrayOutputStream, StandardCharsets.UTF_8);

这是你需要做的唯一更新。

相关内容

  • 没有找到相关文章

最新更新