如何在jQuery.post()之后从Java将文件发送回客户端浏览器

时间:2014-08-22 11:11:49

标签: java javascript ajax http download

我需要帮助将xlsx文件从服务器发送回客户端

以下是它的工作方式:

JavaScript(点击#export_xls按钮):

export_xls: function(event) {
        window.location = ... + this.workspace.query.id + "/export/xls";
}

Java(使用Apache POI API创建xls文件):

@GET
@Produces({"application/vnd.ms-excel" })
@Path("/{queryname}/export/xls/{format}")
public Response getQueryExcelExport(
        @PathParam("queryname") String queryName,
        @PathParam("format") @DefaultValue("flattened") String format){
    // ...
    try {
        byte[] doc = olapQueryService.getExport(queryName,"xls","flat"); // file

        String name = "file.xls";
        return Response.ok(doc, MediaType.APPLICATION_OCTET_STREAM).header(
                "content-disposition",
                "attachment; filename = " + name).header(
                        "content-length",doc.length).build();
    }
    catch (Exception e) {
        log.error("Cannot get excel for query (" + queryName + ")",e);
        return Response.serverError().build();
    }
}

它工作正常,但现在我需要将一些数据从javascript发送到java,然后java处理它并创建xlsx 所以,我使用ajax发送数据(以json格式)......

export_xls: function(event) {
        var data = this.workspace.query.result.lastresult();
        var url = ...  + this.workspace.query.id + "/testexportxls";
        $.ajax({
            url: url,
            type: "POST",
            data: JSON.stringify(data),
            async: false,
            contentType: "application/json"
        });
    },

...并在java中创建我的文件(几乎和以前一样):

@POST
@Produces({"application/vnd.ms-excel" })
@Consumes(MediaType.APPLICATION_JSON)
@Path("/{queryname}/testexportxls")
public Response setQueryExcelExport(final Object jsonData)
{
    Workbook wb = MyFileBuilder.getFile(jsonData);
    try {
        ByteArrayOutputStream bout = new ByteArrayOutputStream();
        wb.write(bout);

        byte[] doc = bout.toByteArray();

        String name = "file.xlsx";
        return Response.ok(doc, MediaType.APPLICATION_OCTET_STREAM).header(
                "content-disposition",
                "attachment; filename = " + name).header(
                "content-length",doc.length).build();
    }
    catch (Exception e){
        log.error("Error while xlsx-file creating. Exception message: ",e);
        return Response.serverError().build();
    }
}

但我现在无法获得该文件,因为我认为这是ajax。

您是否知道一些快速解决方案,只需最少的代码编辑?

不幸的是,我对Response几乎一无所知,或者一些HttpServletResponse以及类似的东西= /

感谢您的时间。

1 个答案:

答案 0 :(得分:0)

如果要在成功时定义回调函数,该函数是否能够处理该文件?

似乎没有,所以我将进行第二次尝试:将JSON放入隐藏表单输入中,然后POST表单?