JavaServlet与文件系统的交互:存储文件并生成用于客户端访问的URL
摘要
- 我需要存储上传和服务器生成的图像,带有便携式和 可预测的路径,以便我的服务器代码知道这些图像存在的位置李>
- 我需要生成可以发送到客户端的这些图像的URL。这些URL将在HTML图像元素中使用李>
问题
我的web应用程序允许用户使用gwtupload(Apache Commons)上传图像。此图像存储在服务器上,并将URL返回给客户端,以便显示图像。gwtupload提供了一个客户端方法来获取上传图像的URL。这在部署中起作用;以下方面不适用:
- 在某些情况下,必须裁剪上传的图像。这导致 由servlet方法生成的新映像。我想储存这个 剪切图像并返回(客户端)访问URL李>
- 然后,该图像被另一种方法用于生成另一个图像 形象此方法必须知道 之前上传(和/或剪切)的图像。新网站的URL 然后图像必须返回给客户端李>
我已经在GWT开发模式下实现了完美的工作。然而,正如我所料,在部署到我自己的Tomcat服务器之后,由于我对文件系统的困惑,远程服务失败了。我不知道如何将这些映像存储在服务器文件系统上可预测的位置,也不知道如何生成访问URL(对于驻留在WAR之外的文件,这些映像将如此)
所有这些映像只在当前会话中需要,因此这些位置可以是临时目录。我花了两天时间在网上做实验,寻找一个解决方案,但都没有用
我将在下面发布节略代码。这是我试图简单地使用工作目录和相对路径名的尝试。使用连接到servlet容器的Eclipse调试器,我可以看到字符串dataDir=context的结果。getRealPath(“foo”)表示servlet中的临时文件夹:但当我使用explorer导航到那里时,没有任何文件被写入磁盘。我很困惑
public String[] generatePreview(String xml) {
PreviewManager manager = new PreviewManager();
String url;
try{
preview = manager.generatePreview(xml);
}
catch (Exception e){e.printStackTrace();}
//Create the preview directory
File folder = new File("previews");
if (!folder.exists()) folder.mkdir();
//The file to be written to
File output = new File(folder, "front.jpg");
ServletContext context = getServletContext();
String dataDir = context.getRealPath("previews");
try {
ImageIO.write(image, "jpg", output);
} catch (IOException e) {
e.printStackTrace();
}
url = "previews/" + output.getName();
return url;
}
@Override
public String cropBackground(int[] coord_pair, String relativePath) {
File backgroundsFolder = new File("backgrounds");
if (!backgroundsFolder.exists()) backgroundsFolder.mkdir();
ServletContext context = getServletContext();
String dataDir = context.getRealPath("backgrounds");
File current = new File(relativePath);
String croppedName = "cropped_" + relativePath.replace("./backgrounds/", "");
int x = coord_pair[0];
int y = coord_pair[1];
int width = coord_pair[2];
int height = coord_pair[3];
String croppedPath = null;
try {
croppedPath = imageCropper.createCroppedImage(current, "backgrounds", croppedName, x, y, width, height);
}
catch (IOException e){
e.printStackTrace();
}
current.delete();
return "backgrounds/" + croppedPath;
我知道我当前的“return”语句在部署中永远不会起作用:我需要正确地生成URL并作为字符串返回。对于问题的长度我很抱歉,但我想把我的问题说清楚
# 1 楼答案
在Tomcat之外选择一个存储图像的目录。为每个上传或生成的图像分配一些唯一的ID,并将图像存储在此目录中(例如,ID作为文件名)
生成指向图像servlet的URL,该图像servlet将按此目录中的ID读取图像,并将图像的字节发送到servlet响应的输出流:
image.action?id=theImageId