我从客户端应用程序接收doPost方法中的图像。我不应该将此图像存储在任何文件夹路径中,因此我使用以下代码将此图像作为数据字节存储在会话属性中。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
String fileName = null;
fileName = request.getParameter("filename");
System.out.println("filename: " + fileName);
DataInputStream din = new DataInputStream(request.getInputStream());
byte[] data = new byte[0];
byte[] buffer = new byte[512];
int bytesRead;
while ((bytesRead = din.read(buffer)) > 0) {
// construct an array large enough to hold the data we currently have
byte[] newData = new byte[data.length + bytesRead];
// copy data that was previously read into newData
System.arraycopy(data, 0, newData, 0, data.length);
// append new data from buffer into newData
System.arraycopy(buffer, 0, newData, data.length, bytesRead);
// set data equal to newData in prep for next block of data
data = newData;
}
request.getSession().setAttribute("imageData", data);
}
我希望在收到之后从doGet方法中检索它。所以,我正在尝试使用以下doGet代码来检索它。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
byte[] data = (byte[]) request.getSession().getAttribute("imageData");
int len = data.length;
byte[] imageData = new byte[len];
for(int i=0; i < len; i++) {
imageData[i] = data[i];
}
response.setContentType("image/jpg");
response.getOutputStream().write(imageData);
response.getOutputStream().flush();
response.getOutputStream().close();
}
但是,当我在一段时间后从另一个客户端调用这个servlet时,它不会在doGet中返回这个图像。
有人可以告诉我,我在这里做错了因为没有在doGet中获取图像吗?
答案 0 :(得分:1)
我不应该将此图像存储在任何文件夹路径中,因此我使用以下代码将此图像作为数据字节存储在会话属性中。
...
但是,当我在一段时间后从另一个客户端调用此servlet时,它不会在doGet中返回此图像。
会话属性只与一个客户端相关联,因此一个客户端无法从其他客户端获取会话属性
您可以将图像存储在servlet上下文中,例如:
ServletContext context = request.getSession().getServletContext();
context.setAttribute("imageData", data);
稍后,您可以从servlet上下文中读取该属性。
或者,另一种可能性是将图像存储在静态变量中。
但是,图像将被存储,尽管它在内存中。也许一些Servlet容器还在硬盘上存储Servlet Context属性。