java逻辑帮助保存图像

时间:2011-03-23 16:07:51

标签: java servlets

我有一个词云应用程序,它根据用户输入文本生成图像。生成的图像存储在images文件夹中。我提供了保存图片选项,允许用户将此图片保存在桌面上。我这样做是通过调用下面显示的servlet读取存储的图像&写入字节流。

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    response.setHeader("Content-disposition","attachment; filename=output.png");

    String filename = request.getSession().getServletContext().getRealPath("/")+"/images/output.png";
    String mimeType = "image/png";
    response.setContentType(mimeType);

    File file = new File(filename);
    response.setContentLength((int)file.length());
    FileInputStream in = new FileInputStream(file);
    OutputStream outputStream = response.getOutputStream();

    byte[] buf = new byte[1024];
    int count = 0;
    while ((count = in.read(buf)) >= 0) {
        outputStream.write(buf, 0, count);
    }
    in.close();
    outputStream.close();


} 

这种方法的问题是,如果另一个用户(用户2)同时生成一个词云,它会用这个新图像替换output.png。现在,如果用户1尝试保存图像,则会得到错误的图像(用户2的图像)。

您能否建议我采用更好的方法来保持用户特定的图像?

3 个答案:

答案 0 :(得分:4)

如何为图像生成唯一的文件名,而不是一直使用相同的文件名?

然后,文件名可以存储在用户的会话中,或者作为URL参数传递给第二个Servlet。这允许大量用户生成图像(只要您的文件名真的唯一),并且仍然使用基于磁盘的方法。

您也可以直接在用户会话中存储图像,但这会占用大量内存,并非​​所有用户都会使用“桌面保存”功能。

编辑: 此外,当您决定实施此方法时,请记住用户也可以同时生成两个图像(例如,如果他在两个选项卡中打开您的服务)。我认为在这种情况下,真正独特的文件名比用户名更好。

答案 1 :(得分:1)

在请求中传递用户名或其他唯一字符串以用于文件名。

  

...基于用户输入文字的图像...

您还可以从该输入文本生成文件名,因此您可以尝试按文本缓存图像,并将已生成的图像重新用于相同的文本(如果适合您的情况)。

答案 2 :(得分:0)

使用output.png

等名称重命名<username>.png