Gwt 如何通过点击按钮下载文件?

Gwt 如何通过点击按钮下载文件?,gwt,Gwt,我有一个提供文件的服务台 我正在使用GWT构建一个带有“下载”按钮的页面 如何让GWT客户端在onClick事件中下载文件 附加说明:锚点可以工作,但按钮看起来更好。如果您有文件地址。您可以打开如下所示的窗口: downloadButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { Window.open("http://127.0

我有一个提供文件的服务台

我正在使用GWT构建一个带有“下载”按钮的页面

如何让GWT客户端在onClick事件中下载文件


附加说明:锚点可以工作,但按钮看起来更好。

如果您有文件地址。您可以打开如下所示的窗口:

downloadButton.addClickHandler(new ClickHandler() {

    @Override
    public void onClick(ClickEvent event) {
        Window.open("http://127.0.0.1:8888/file.rar", "_self", "enabled");
    }
});

javadoc可以帮助您完成示例,使用GWT、ApachePOI下载.xls文件

    Environment : GWT SDK 2.4
    Spring 3.0.2M
    JAVA : 1.7
创建.xls文件所需的Jar文件::poi-3.0.1-FINAL.Jar

exportButton.addClickHandler(新的ClickHandler(){

现在在浏览器中,当用户点击按钮exportButton时,控件导航到web.xml并搜索以/myfiledownload结尾的url模式

web.xml

    <servlet>
        <servlet-name>fileDownload</servlet-name>
        <servlet-class>com.sbabamca.server.FileDownloadServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>fileDownload</servlet-name>
        <url-pattern>/app/myfiledownload</url-pattern>
    </servlet-mapping>

文件下载
com.sbabamca.server.FileDownloadServlet
文件下载
/app/myfiledownload
在web.xml中执行代码后,控件尝试执行名为FileDownloadServlet的servlet

服务器端
FileDownloadServlet.java
------------------------    
包com.sbabamca.server;
导入javax.servlet.http.HttpServlet;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpServletResponse;
导入javax.servlet.ServletException;
导入org.apache.poi.hssf.usermodel.HSSFRow;
导入org.apache.poi.hssf.usermodel.HSSFSheet;
导入org.apache.poi.hssf.usermodel.HSSFWorkbook;
导入org.hibernate.Query;
导入org.hibernate.Session;
导入org.hibernate.SessionFactory;
导入org.hibernate.Transaction;
导入org.hibernate.metadata.ClassMetadata;
导入com.fpix.hibernate.util.HibernateUtil;
导入com.fpix.util.date.MyDate;
导入java.io.IOException;
导入java.util.ArrayList;
公共类MyFileServlet扩展了HttpServlet{
会话工厂会话工厂;
会议;
事务tx=null;
@SuppressWarnings({“未选中”、“弃用”})
受保护的void doGet(HttpServletRequest-req,HttpServletResponse-resp)抛出ServletException,IOException{
分别为setContentType(“应用程序/vnd.ms excel”);
resp.setHeader(“内容处置”、“附件;文件名=users.xls”);
试一试{
sessionFactory=HibernateUtil.getSessionFactory();
如果(!sessionFactory.getCurrentSession().isOpen())
{
session=sessionFactory.openSession();
}
其他的
{
session=sessionFactory.getCurrentSession();
}
tx=session.beginTransaction();
tx.begin();
Query qry=session.createQuery(“from com.fpix.dto.User u”);
ArrayList u=(ArrayList)qry.list();
Query qry1=session.createQuery(“from com.fpix.dto.Profile p”);
ArrayList p=(ArrayList)qry1.list();
/*
*获取用户和配置文件实体的列名的代码
*/
ClassMetadata cm=sessionFactory.getClassMetadata(com.fpix.dto.User.class);
字符串userAttributes[]=cm.getPropertyNames();
ClassMetadata cm1=sessionFactory.getClassMetadata(com.fpix.dto.Profile.class);
字符串profileAttributes[]=cm1.getPropertyNames();
HSSFWorkbook wb=新的HSSFWorkbook();
HSSFSheet sheet=wb.createSheet(“Excel工作表”);
HSSFRow rowhead=sheet.createRow((短)0);
rowhead.createCell((短)0.setCellValue(“id”);
/*
*用于在.xls文件中创建列名称的代码
*/
int j=0;
对于(inti=0;i我喜欢


上述解决方案都不适用于我,然后我意识到我已经有了一个可行的实施方案。我是这样做的:

Window.open(fileUrl, "_parent", "");
但关键在于servlet:

response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");

此解决方案不会打开新窗口,而是直接打开“另存为”对话框。这两种方法都是最好的。

确定-新窗口在打开后立即关闭(Chrome浏览器)如果文件可以像PDF或TXT一样从浏览器中读取,则上述解决方案不起作用。该文件将在同一页面中打开。锚定可能看起来不太好,但更便于用户使用,因为它为用户提供了更多保存文件的控制。锚定允许用户右键单击,选择[另存为]并指定下载的位置和文件名。同样,一个太复杂的示例和一个未请求的URL。请停止。+1,这很好,因为它不会启动冗余窗口。
Window.Location.replace("/downloadServlet");
Window.open(fileUrl, "_parent", "");
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");