当前位置: 首页 > 面试题库 >

在smartGWT中打开/保存文件

茅慈
2023-03-14
问题内容

我已经实现了RPCService,RPCServiceAsync和RPCServieImpl。单击按钮后,将调用服务器端的服务,该服务将从数据库中获取数据并创建文件。创建文件后,我需要在客户端打开该文件,并需要提示一个带有打开/保存选项的对话框。我如何实现此打开文件部分。请提出一种实施t
..的方法。

@Hambend:我还有一个澄清点!..如何在另一个servlet中调用此doGet方法,即在我的onmodule加载类中,我有许多布局独立的小部件,而这样的小部件是BUTTON?在单击此按钮服务后,将调用RPCServiceImpl,并完成所有操作,并在一个分函数(public
int GenerateFile(String
name)())中创建文件。如何使该函数调用doGet方法?由于doGet需要请求,因此响应参数将与之一起传递?请建议我一个方法来调用该方法。提前致谢


问题答案:

GWT的RPC服务只能将Java对象发送回客户端。要将文件发送回用户,您将需要使用非GWT Java
servlet。这是我之前用来从存储库提供jpeg图像的一些代码。

public class ImageServlet extends HttpServlet {
    private final String repository = "/var/images/";

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        String filename = request.getParameter("file");

        // Security: '..' in the filename will let sneaky users access files
        // not in your repository.
        filename = filename.replace("..", "");

        File file = new File(repository + filename);
        if (!file.exists())
            throw new FileNotFoundException(file.getAbsolutePath());

        response.setHeader("Content-Type", "image/jpeg");
        response.setHeader("Content-Length", String.valueOf(file.length()));
        response.setHeader("Content-disposition", "attachment;filename=\"" + filename + "\"");

        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
        BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
        byte[] buf = new byte[1024];
        while (true) {
            int length = bis.read(buf);
            if (length == -1)
                break;

            bos.write(buf, 0, length);
        }
        bos.flush();
        bos.close();
        bis.close();
    }
}

“内容处置:附件”应导致大多数浏览器下载文件而不是显示文件,文件名默认为您提供的文件名。使用该Servlet的方式是让用户调用您已经拥有的RPCService,它将文件保存到存储库文件夹中。然后,使用诸如http://your.domain.com/fileServlet?file=myFile.jpg之类的URL将它们链接或重定向到该servlet
。显然,使用此设置会带来安全隐患,如果用户可以猜测其他文件名,则他们可以下载其他人的文件。

您可能想做的是将RPC服务中的数据库代码合并到此Servlet中。无需将文件保存在服务器上的任何位置,您可以将数据库结果以与将它们写入文件的方式完全相同的方式将它们写入到response.getOutputStream()或response.getWriter()中,除了结果会直接面向用户。只要正确设置了内容标题,用户就不会注意到它们之间的区别。

您不能从另一个servlet调用此方法,使浏览器将其下载为文件的唯一方法是通过常规HTTP请求对其进行访问。首先,像在GWT
RPC服务中一样,在web.xml文件中声明servlet:

<servlet>
    <servlet-name>ImageServlet</servlet-name>
    <servlet-class>
        com.package.ImageServlet
    </servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ImageServlet</servlet-name>
    <url-pattern>/imageServlet</url-pattern>
</servlet-mapping>

现在,去往http://your.tomcat.server/webapp/imageServlet的所有HTTP
GET请求都将被ImageServlet.doGet()接收。然后在客户端,您可以建立到该文件的普通html链接:

new HTML("<a href='" + GWT.getHostPageBaseURL() + "imageServlet?file=" + filename + "'>download</a>");

…或者,您 应该 可以将其放入ClickHandler(我尚未对其进行测试):

Window.Location.assign(GWT.getHostPageBaseURL() + "imageServlet?file=" + filename);


 类似资料:
  • 我使用Protégé“Open from URL”下载了dron本体。在它的.owl文件中只是一系列URL,Protégé使用这些URL从Internet加载它们。我正在保存这个项目,但是唯一保存的是原始文件(包含URL的文件),而且每次我都应该从互联网上获取所有的数据。我应该怎么做才能将完整的文件保存到我的计算机磁盘上呢?

  • 我是Java的初学者。我正在使用netbeans 7.3 IDE的GUI编辑器制作一个简单的文本编辑器。我面临的主要问题是无法保存/打开文件。我已经创建了“保存”按钮。当我删除文件选择器时,它是一个嵌入在java窗口中的正常打开的文件对话框,没有任何功能。我还尝试在单击save按钮(在源代码视图中)时创建一个新的jFileChooser,但它不起作用 简而言之,我需要一个简单的打开/保存对话框。当

  • 我已经花了六个小时从谷歌的文件,我仍然不知道如何开始与这个。我想做的就是让我现有的Android应用程序可以从Google Drive读取文件,上传新文件到Google Drive,并编辑Google Drive上的现有文件。 我读到过Drive SDK v2专注于让Android(以及一般的移动)开发人员轻松地使用它,但在他们的文档中似乎几乎没有任何关于它的内容。 理想的情况下,我希望有人能指出

  • 有一个Angular 6应用程序有一个下载pdf文件的功能。它使用来自另一个spring boot应用程序的REST API下载文件。 要求是我需要在新标签打开pdf文件,而保存它应该有一个有意义的名称。 我可以得到文件下载和打开在新的标签。但在保存文件时,它从URL中取名字。 我尝试在浏览器中直接从REST API打开文件并保存它,以及从angular App获取blob并在新窗口中打开。两者都

  • SmartGWT是一个利用GWT封装SmartClient的开源项目。类似于GWT-Ext。SmartClient是一个企业级的ajax框架,包括非常出色的UI库、工具库和客户端服务端数据绑定等功能。

  • 我正在使用上传文件。如果用户启动打开文件对话框(使用Uploadify选择文件按钮),则会出现一个窗口,用户可以在其中导航到他的路径并选择应上传的文件。现在,Internet Explorer 不存储路径。如果用户再次单击选择文件按钮,他必须再次导航到所需的文件夹。 我知道用户可以一次上传多个文件,但我被问及是否可以存储路径以供下次使用(例如Firefox的行为)。当然,他可以使用另一个浏览器,但