有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaServlet与文件系统的交互:存储文件并生成用于客户端访问的URL

摘要

  1. 我需要存储上传和服务器生成的图像,带有便携式和 可预测的路径,以便我的服务器代码知道这些图像存在的位置
  2. 我需要生成可以发送到客户端的这些图像的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) 个答案

  1. # 1 楼答案

    在Tomcat之外选择一个存储图像的目录。为每个上传或生成的图像分配一些唯一的ID,并将图像存储在此目录中(例如,ID作为文件名)

    生成指向图像servlet的URL,该图像servlet将按此目录中的ID读取图像,并将图像的字节发送到servlet响应的输出流:image.action?id=theImageId