概括
- 我需要使用可移植和可预测的路径存储上传的和服务器生成的图像,以便我的服务器代码知道这些图像存在的位置。
- 我需要为这些可以发送到客户端的图像生成 URL。这些 URL 将用于 HTML 图像元素。
问题
我的 Web 应用程序允许用户使用 gwtupload(Apache Commons) 上传图像。此图像存储在服务器上,并将 URL 返回给客户端,以便显示图像。gwtupload 提供了一个客户端方法来获取上传图像的 URL。这适用于部署;以下方面没有:
- 在某些情况下,必须裁剪上传的图像。这会导致 servlet 方法生成一个新图像。我想存储这个裁剪的图像并返回(给客户端)一个访问 URL。
- 然后,这个图像被另一种方法用来生成另一个图像。此方法必须知道先前上传(和/或裁剪)图像在文件系统上的位置。然后必须将新图像的 URL 返回给客户端。
我的实现在 GWT 开发模式下完美运行。但是,正如我所料,在部署到我自己的 Tomcat 服务器后,由于我对文件系统的困惑,远程服务失败了。我不知道将这些图像存储在服务器文件系统上可预测位置的正确方法,也不知道如何生成访问 URL(对于驻留在 WAR 之外的文件,因为这些图像会。)
所有这些图像仅在当前会话中需要,因此位置可以是临时目录。我花了两天时间在网上试验和拖网寻找解决方案,但无济于事。
我将在下面发布精简代码。这是我尝试简单地使用工作目录和相对路径名。使用附加到我的 servlet 容器的 Eclipse 调试器,我可以看到 String dataDir = context.getRealPath("foo") 指示 servlet 中的临时文件夹的结果:但是当我使用资源管理器导航到那里时,没有写入任何文件到磁盘。我很困扰。
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;
我知道我当前的“返回”语句在部署中永远不会起作用:我需要正确生成 URL 并作为字符串返回。对于问题的长度,我很抱歉,但我想澄清我的问题。