我有一个词云应用程序,它根据用户输入文本生成图像。生成的图像存储在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的图像)。
您能否建议我采用更好的方法来保持用户特定的图像?
答案 0 :(得分:4)
如何为图像生成唯一的文件名,而不是一直使用相同的文件名?
然后,文件名可以存储在用户的会话中,或者作为URL参数传递给第二个Servlet。这允许大量用户生成图像(只要您的文件名真的唯一),并且仍然使用基于磁盘的方法。
您也可以直接在用户会话中存储图像,但这会占用大量内存,并非所有用户都会使用“桌面保存”功能。
编辑: 此外,当您决定实施此方法时,请记住用户也可以同时生成两个图像(例如,如果他在两个选项卡中打开您的服务)。我认为在这种情况下,真正独特的文件名比用户名更好。
答案 1 :(得分:1)
在请求中传递用户名或其他唯一字符串以用于文件名。
...基于用户输入文字的图像...
您还可以从该输入文本生成文件名,因此您可以尝试按文本缓存图像,并将已生成的图像重新用于相同的文本(如果适合您的情况)。
答案 2 :(得分:0)
使用output.png
<username>.png