无法使用Angular JS和spring MVC打开下载文件

Cannot open a download file with Angular JS and spring MVC

本文关键字:MVC 下载 文件 spring Angular JS      更新时间:2023-09-26

我正在我的网站上实现一个函数,并使用Angular JS。我已经在服务器端上实现了导出文件的服务。在客户端,我创建了一个"EXPORT OPTION",然后当用户单击该按钮时,用户可以下载该文件(从服务器端的服务导出),并将其自动保存在本地机器的下载文件夹中。我是从这个问题的"极端"答案中得出这个想法的:如何使用AngularJS并调用MVC API下载文件?

一切都做得很好,但是,当我打开保存到下载文件夹中的文件时,显示了一条错误消息:"Excel无法打开文件"filename.xlsx",因为文件扩展名的文件格式无效。请验证文件是否已损坏,以及文件扩展名是否与文件的格式匹配。"

我相信问题来自客户端,因为当我在服务端运行服务(用于导出文件)时,文件被正确创建和打开,没有任何错误。我一直在调查这个问题,然后我发现问题应该来自文件路径".xlsx".

以下是用于在服务器端导出文件的java代码:

@RequestMapping(value = "/exportFile", method = RequestMethod.GET)
public String exportHRSalaryByAcc(HttpServletRequest request, HttpServletResponse response,
        @RequestParam(value = "month", defaultValue = "") String month) throws IOException, GeneralSecurityException, InvalidFormatException{
    String rs = FALSE;
    response.addHeader("Access-Control-Allow-Origin", "*");
    response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
    //response.setContentType("application/x-felix; charset=us-ascii");
    response.setHeader("Content-Transfer-Encoding", "7bit");
    String fName = null;
    Calendar cal = Calendar.getInstance();
    int m = 0;
    try {
        if(StringUtils.isNotEmpty(String.valueOf( month))  || StringUtils.isNotEmpty(String.valueOf( year))){
            if (DateUtils.isValidFormatver2(Integer.parseInt(month), Integer.parseInt(year))) {
                    m = Integer.parseInt(month);
                    fName = "C:''LOCAL''FILE_" + "[" + m + "]" + "[" + y + "]" + ".xlsx";
                    // CREAT FILE
                    rs = eService.runExportDataHRSalay(m, fName);
            }  else {
                return ErrorMessage.FILE_MESS;
            }
        } else {
            m = cal.get(Calendar.MONTH) + 1;
            fName = "C:''LOCAL''FILE_" + "[" + m + "]" +  ".xlsx";
            rs = eService.runExportDataHRSalay(m, fName);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    response.setHeader("Content-Disposition", "attachment; filename='"" + fName);
    return rs;
}

这是客户端的代码,我使用了angularjs:

      .....
      month = currentTime.getMonth() + 1;
      var check = confirm("Are you sure to run the data ?");    
                    if(check == true){
                        $http({
                            url : www.serviceFromServerSide.abc/exportFile,
                            method : 'GET',
                            headers : {
                                'Content-type' : 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
                            },
                            responseType : 'arraybuffer'
                       }).success(function(data, status, headers, config) {
                            var file = new Blob([ data ], {
                                type : 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
                            });
                            //trick to download store a file having its URL
                            var fileURL = URL.createObjectURL(file);
                            var a         = document.createElement('a');
                            a.href        = fileURL; 
                            console.dir(fileURL);
                            a.target      = '_blank';
                            a.download    = 'FILE__' + '[' + month + ']'+ '.xlsx';
                            document.body.appendChild(a);
                            a.click();
                            $("#loadingImage").css("display", "none");
                            $("#backgroundPopup").fadeOut(400);
                       }).error(function(data, status, headers, config) {
                       });
                    }else{}..........

请帮我弄清楚,我真的很累。谢谢大家,很抱歉解释不好。

我遇到了同样的问题,我修复了它,用.xls替换.xlsx,基本上是:

response.addHeader("内容处置","附件;filename=report.xls");

在您的代码处,替换这行代码:

fName = "C:''LOCAL''FILE_" + "[" + m + "]" + "[" + y + "]" + ".xlsx";

带有:

fName = "C:''LOCAL''FILE_" + "[" + m + "]" + "[" + y + "]" + ".xls";