使用servlet在jsp中显示图像

时间:2011-09-01 16:05:59

标签: image jsp servlets

我正在开发一个应用程序,其中添加和修改(更新)用户的信息。

添加模块中,管理员输入用户详细信息,并在“添加”按钮生成unique-id(abc001)。和admin还将用户的图像/图片(名称:abc001)保存在服务器位置(// some-location-ip address / D drive / images)。

“更新”模块中,管理员可以修改用户详细信息,但无法修改ID。

在几个场景中我需要一些方向。

如果管理员“更新”特定用户,管理员点击更新按钮后,服务器中存在的该用户的图像就会显示在页面上。

JSP中的图像代码:

<img height="100px;" width="100px;" src="........." alt="Candidate Image"></img>

我编写了一个servlet,但不知道如何调用与不同用户对应的不同图像并在配置文件页面上显示图像。

用户配置文件将显示用户A图像 用户B配置文件将显示用户B图像 等等

Servlet代码片段

public class UpDatePhoto extends HttpServlet {

    public UpDatePhoto () {
        super();
        // TODO Auto-generated constructor stub
    }

   private static final long serialVersionUID = -8071854868821235857L;
   private static final int DEFAULT_BUFFER_SIZE = 10240; // 10KB.
   private String imagePath;

   *public void init() throws ServletException {
        this.imagePath = "D:\\photo_not_available_large.png";
    }*

   protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException
    {
        String requestedImage = request.getPathInfo();
        if (requestedImage == null) {
            response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404.
            return;
        }

        File image = new File(imagePath, URLDecoder.decode(requestedImage, "UTF-8"));

        String contentType = getServletContext().getMimeType(image.getName());

        if (contentType == null || !contentType.startsWith("image")) {
            response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404.
            return;
        }

        response.reset();
        response.setBufferSize(DEFAULT_BUFFER_SIZE);
        response.setContentType(contentType);
        response.setHeader("Content-Length", String.valueOf(image.length()));
        response.setHeader("Content-Disposition", "inline; filename=\"" + image.getName() + "\"");

        BufferedInputStream input = null;
        BufferedOutputStream output = null;

        try {

            input = new BufferedInputStream(new FileInputStream(image), DEFAULT_BUFFER_SIZE);
            output = new BufferedOutputStream(response.getOutputStream(), DEFAULT_BUFFER_SIZE);

            byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
            int length;
            while ((length = input.read(buffer)) > 0) {
                output.write(buffer, 0, length);
            }
        } finally {

            close(output);
            close(input);
        }
    }


    private static void close(Closeable resource) {
        if (resource != null) {
            try {
                resource.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

} 

图像不是http可访问的,但只能作为文件访问,servlet必须打开图像文件,读取内容并将它们放在响应缓冲区中“......不确定我是否正确。

有人可以指导我指导并帮助我解决如何从服务器目录位置获取图像并为用户显示正确的图像。

1 个答案:

答案 0 :(得分:1)

我很难理解具体问题,但我相信您的根本问题是您不知道如何相应地设置imagePath?它有一个错误的值。代码显示它应该被设置到放置所有图像的根文件夹。在底层操作系统平台中,您需要将//some-location-ip address/D drive/images映射为Windows资源管理器中的网络驱动器,例如: Z:,然后在imagePath中使用它。

this.imagePath = "Z:";

它还希望图像文件名为请求路径信息。因此,假设您的servlet映射到/images/*的网址格式,那么您的<img src>应该看起来基本上就像这样

<img src="images/filename.png" />

你也可以用EL动态填充它。例如。使用登录用户的唯一用户名:

<img src="images/${user.name}.png" />

关于使用"D:\\photo_not_available_large.png"替换图片,您可以在File#exists()返回false时进行设置。