Liferay DLFileEntry 图像转换未完全转换图像

4
我正在使用以下代码将一张JPG格式的图片转换为DLFileEntry的PNG格式。
    try {
        DLFileEntry dlFileEntry = DLFileEntryServiceUtil.getFileEntry(dlFileEntryId);
        InputStream inputStream = dlFileEntry.getContentStream();

        ByteArrayOutputStream buffer = new ByteArrayOutputStream();
        int nRead;
        byte[] data = new byte[1024];
        while ((nRead = inputStream.read(data, 0, data.length)) != -1) {
            buffer.write(data, 0, nRead);
        }
        buffer.flush();
        byte[] byteArray = buffer.toByteArray();

        ImageBag imageBag = ImageToolUtil.read(byteArray);
        RenderedImage renderedImage = imageBag.getRenderedImage();
        if (renderedImage == null) {
            throw new IOException("Unable to decode image");
        }

        renderedImage = ImageToolUtil.scale(renderedImage, 2000);

        buffer = new ByteArrayOutputStream();
        ImageIO.write(renderedImage, "png", buffer); 
        InputStream fis = new ByteArrayInputStream(buffer.toByteArray());

        DLAppServiceUtil.updateFileEntry(
                dlFileEntry.getFileEntryId(),
                dlFileEntry.getName(),
                MediaType.IMAGE_PNG_VALUE,
                dlFileEntry.getTitle(),
                dlFileEntry.getDescription(),
                "",
                true,
                fis,
                buffer.size(),
                serviceContext);

    } catch (Exception e) {
        e.printStackTrace();
    } 

尽管在“文档和媒体”中更新了图像内容类型和扩展名,但我们尝试下载该图像时,仍然是JPG格式。

enter image description here

在文档和媒体中,图片看起来像上面的样子。您可以看到内容类型已变为image/png

enter image description here

上面显示了我尝试下载并保存这张图片的截图。当我尝试下载时,它仍然是JPG的原始格式。除了上面的代码,我还需要做什么才能完全将图片转换为PNG格式?

你检查过服务器是否真的返回了错误的内容类型吗?我曾经遇到过一个问题,即一个浏览器(以“I”开头的那个)总是想将PNG图像保存为JPG文件。因此,请尝试在其他浏览器中进行测试。 - Tobias Liefke
@TobiasLiefke 我用IE、Firefox和Chrome都试过了,结果一样。它们都将图像保存为JPG格式。 - Philip John
1个回答

1

您仍然存储旧文件名: dlFileEntry.getName()

我猜测jpegjpg是旧文件名的扩展名,浏览器根据扩展名确定其文件过滤器。

因此最好也更换扩展名:

DLAppServiceUtil.updateFileEntry(
    dlFileEntry.getFileEntryId(),
    dlFileEntry.getName().replaceAll("\\..*?$",".png"),
    ...

这将更改存储在该文件中的扩展名。

很抱歉,但那并没有解决问题。 :-( - Philip John
你应该检查两件事情:存储的文件是否为 png(在十六进制编辑器中打开并检查其是否以0x89 0x50 0x4E 0x47开头)?图像的 HTTP 响应头是什么样子的(可以使用浏览器的开发者工具或者 wget 来查看)? - Tobias Liefke
你能展示一下下载链接吗?因为如果链接中包含 fileName 参数,那么它将会覆盖 DLFileEntry 中设置的任何文件名。 - Tobias Liefke
不,它不包含fileName参数。URL为/documents/20181/24140/Nature01/67156ee9-1e6a-4595-b79a-dc24bbd10ba5?version=3.0&t=1449505888000 - Philip John
好的,最后你可以检查一下以下几点:你的版本中数据库中的扩展名是否仍然是"jpg"?也许不仅文件名,标题中也包含了扩展名吗? - Tobias Liefke
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接