【问题标题】:Serialize a java.io.File within a JSON w/ Jackson在带有 Jackson 的 JSON 中序列化 java.io.File
【发布时间】:2016-12-14 00:39:12
【问题描述】:

我有一个 Web 服务 (Jersey 2),它返回几个 DOCX 和 PDF 文件。我不知道哪种方法最好:

  1. 将它们作为 Octet-Stream 返回。这是我在 2 中实现它之前所拥有的:

        @GET
        @Path("solicitudUsuario/plantilla")
        @Produces(MediaType.APPLICATION_OCTET_STREAM)
        public Response descargarPlantillaSolicitudUsuario() throws ConfigurationException, URISyntaxException, IOException{
            File plantillaSolicitudUsuario = this.generalService.getPlantillaSolicitudUsuario();
            return Response.ok(plantillaSolicitudUsuario, MediaType.APPLICATION_OCTET_STREAM).header("Content-Disposition", "attachment; filename=\"" + plantillaSolicitudUsuario.getName() + "\"" ).build();
        }
    
  2. 在 Json 中包装文件。我使用杰克逊作为 json 提供者。这是我到目前为止所做的:

网络服务:

        @GET
        @Path("solicitudUsuario/plantilla")
        @Produces(MediaType.APPLICATION_JSON)
        public Response download() throws ConfigurationException, URISyntaxException, IOException{
            File plantillaSolicitudUsuario = this.generalService.getPlantillaSolicitudUsuario();
            FicheroDevolver f = FicheroDevolver.buildAsWord(plantillaSolicitudUsuario);
            String json = mWriter.writeValueAsString(f);
            return Response.ok(MediaType.APPLICATION_JSON_TYPE.withCharset("UTF-8")).entity(json).build();
        }

序列化器:

        public class FicheroSerializer extends JsonSerializer<FicheroDevolver> {

        @Override
        public void serialize(com.ingartek.ws.zendesk_bizkaibus.model.FicheroDevolver value, JsonGenerator gen, SerializerProvider serializers)
                throws IOException, JsonProcessingException {
            InputStream fis = FileUtils.openInputStream(value.getFichero());

            gen.useDefaultPrettyPrinter();
            gen.writeStartObject();
                gen.writeFieldName("fichero");
                //gen.writeBinary(fis, (int)value.getFicheroLength());
                gen.writeRawValue(IOUtils.toString(fis, "UTF-8"));

                gen.writeStringField("nombre", value.getNombre());

                gen.writeStringField("mimeType", value.getMimeType());
            gen.writeEndObject();

            fis.close();
        }

        }

数据包装器:

            @JsonSerialize(using = FicheroSerializer.class)
            public class FicheroDevolver {

                /*
                 * Atributos
                 */
                private File fichero;
                private String nombre;
                private String mimeType;    

哪种方法最好?

【问题讨论】:

  • 序列化 java.io.File 只会序列化文件名。究竟有什么意义?
  • @EJP 我不想将路径写为 json 属性,我想要的是发送数据本身。然后,在客户端中,解码并提供服务。你明白我的意思吗?
  • 在这种情况下,您的问题标题错误。 java.io.File 只代表一个文件名。

标签: java json serialization jersey jackson


【解决方案1】:

你可以这样使用:

    File file = new File(FILE_PATH);
    ResponseBuilder response = Response.ok((Object) file);
    response.header("Content-Disposition",
                "attachment; filename=new-android-book.pdf");
    return response.build();

javax.ws.rs.core.Response.ResponseBuilder

【讨论】:

  • 所以你建议使用第一种方法,不是吗?
  • 如果我是你,我会使用第一种方法。
  • 谢谢@Art_Rebel。最初我是这样做的。问题是如何使用 jQuery 和 JS 获取文件。
  • 不是,确实是另一个问题。这是要根据社区了解哪种方法最好。为什么投反对票?
  • 我没有将您的问题标记为没有帮助。是别人。
猜你喜欢
  • 2012-03-17
  • 2012-07-27
  • 2013-10-25
  • 2015-10-05
  • 2017-04-04
  • 2023-03-04
  • 2018-02-28
  • 2014-08-30
  • 2019-06-27
相关资源
最近更新 更多