简体   繁体   English

如何在JSF中显示来自数据库的图像

[英]How to display images from database in JSF

I have images that are stored in the database as a BLOB. 我有图像作为BLOB存储在数据库中。 Now I can display them in my jsf pages using Richfaces mediaOutput tag. 现在我可以使用Richfaces mediaOutput标签在我的jsf页面中显示它们。

Is it possible for images to have path like "/images/image.jpg" while images are stored in the database. 当图像存储在数据库中时,图像是否可能具有类似“/images/image.jpg”的路径。

While searching for an answer I came around something like this: 在寻找答案时,我遇到了类似这样的事情:

@GET
@Path("/files/{filename}")
@Produces(MediaType.WILDCARD)

Best regards, Ilya Sidorovich 最诚挚的问候,Ilya Sidorovich

You could write a servlet picking up every request to /image/* or something that suits you. 您可以编写一个servlet来获取/image/*或适合您的任何请求。 And in your servlet you retrieve the correct data from your database via request parameters. 在servlet中,您可以通过请求参数从数据库中检索正确的数据。 And you write out the data via 你通过写出数据

response.getOutputStream().write(content); 

(content being the bytearray of you image) (内容是你图像的字节)

Thank you roel and BalusC! 谢谢roel和BalusC!

If anyone comes around this issue, here is what you can do. 如果有人遇到这个问题,这就是你能做的。

    package org.gicm.test;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.inject.Inject;
import java.io.BufferedOutputStream;
import java.io.BufferedInputStream;
import org.gicm.cms.CMSDao;
import org.gicm.model.UploadedImage;

@WebServlet("/images/*")
public class TestServlet extends HttpServlet {

    @Inject
    private CMSDao cms;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String imageId = String.valueOf(request.getPathInfo().substring(1)); // Gets string that goes after "/images/".
        UploadedImage image = cms.findImage(imageId); // Get Image from DB.

        response.setHeader("Content-Type", getServletContext().getMimeType(image.getName()));
        response.setHeader("Content-Disposition", "inline; filename=\"" + image.getName() + "\"");

        BufferedInputStream input = null;
        BufferedOutputStream output = null;

        try {
            input = new BufferedInputStream(image.getData()); // Creates buffered input stream.
            output = new BufferedOutputStream(response.getOutputStream());
            byte[] buffer = new byte[8192];
            for (int length = 0; (length = input.read(buffer)) > 0;) {
                output.write(buffer, 0, length);
            }
        } finally {
            if (output != null) try { output.close(); } catch (IOException logOrIgnore) {}
            if (input != null) try { input.close(); } catch (IOException logOrIgnore) {}
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM