Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Servlet与文件系统的交互:存储文件并生成用于客户端访问的URL_Java_Gwt_Servlets - Fatal编程技术网

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

Java Servlet与文件系统的交互:存储文件并生成用于客户端访问的URL,java,gwt,servlets,Java,Gwt,Servlets,摘要 我需要存储上传和服务器生成的图像,便携式和 可预测的路径,以便我的服务器代码知道这些映像存在的位置 我需要生成可以发送到客户端的这些图像的URL。这些URL将在HTML图像元素中使用 问题 我的web应用程序允许用户使用gwtupload(apachecommons)上传图像。此图像存储在服务器上,并将URL返回给客户端,以便显示图像。gwtupload提供了一个客户端方法来获取上传图像的URL。这在部署中起作用;以下方面不适用: 在某些情况下,必须裁剪上载的图像。这导致 由servle

摘要

  • 我需要存储上传和服务器生成的图像,便携式和 可预测的路径,以便我的服务器代码知道这些映像存在的位置
  • 我需要生成可以发送到客户端的这些图像的URL。这些URL将在HTML图像元素中使用
  • 问题

    我的web应用程序允许用户使用gwtupload(apachecommons)上传图像。此图像存储在服务器上,并将URL返回给客户端,以便显示图像。gwtupload提供了一个客户端方法来获取上传图像的URL。这在部署中起作用;以下方面不适用:

    • 在某些情况下,必须裁剪上载的图像。这导致 由servlet方法生成的新映像。我想储存这个 裁剪图像并返回(客户端)访问URL
    • 然后,该图像被另一种方法用于生成另一个图像 形象。此方法必须知道的文件系统上的位置 以前上载(和/或裁剪)的图像。新网站的URL 然后必须将图像返回给客户端
    我已经在GWT开发模式下实现了完美的工作。然而,正如我所预料的,在部署到我自己的Tomcat服务器之后,由于我对文件系统的混淆,远程服务失败了。我不知道如何将这些映像存储在服务器文件系统上可预测的位置,也不知道如何生成访问URL(对于驻留在WAR之外的文件,就像这些映像一样)

    所有这些映像仅用于当前会话,因此位置可以是临时目录。我花了两天的时间在网络上做实验,寻找一个解决方案,但毫无结果

    我将在下面发布节略代码。这是我试图简单地使用工作目录和相对路径名的尝试。使用附加到servlet容器的Eclipse调试器,我可以看到字符串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;
    

    我知道我当前的“return”语句在部署中永远不会起作用:我需要正确地生成URL并作为字符串返回。对于问题的长度我很抱歉,但我想把我的问题说清楚

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


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

    选择存储图像的目录:为确保写访问,我将使用用户的主目录(执行Tomcat进程的用户)通过抓取环境变量。我将使用文件名作为唯一ID。生成一个图像servlet的URL,该图像servlet将在此目录中按ID读取图像::让我澄清一下:我将使用一个URL构建我的图像小部件,该URL将为指定的文件名寻址该图像servlet,响应将是图像。GWT将处理显示此图像。我将如何与客户端通信URL?是否有某种方法可以生成/确定图像servlet的URL(我尚未创建)从上面的代码?如果是,则不需要客户端更改,因为我可以从上面的远程方法返回此URL。URL始终相同:http:////image.action?id=Thank 我想我明白需要什么了,我今天会做这件事,希望它能顺利进行。另一个问题:既然我在使用GWT,我应该使用G吗是为我的图像servlet创建WTRPC框架,还是创建一个传统的JavaEEservlet,让我的GWT代码可以与之通信?