如何下载AJAX java使用的zip文件

how to download zip file used by AJAX java

提问人:King Henry 提问时间:10/17/2023 更新时间:10/17/2023 访问量:41

问:

通过ajax将数据传递给控制器后, 我在 C:\Users\user\AppData\Local\Temp 文件夹中完成了 zip 文件的创建。 它确实在我提到的上面的文件夹中打开得很好。 但是当我单击jsp按钮并下载它时,zip文件没有打开。它甚至占用空间。 我搜索了一下,仅使用ajax无法实现下载功能, 所以我添加了 xhr,但我遇到了困难,因为我对 xhr 了解不多。 你能告诉我哪里出了问题吗?

  • JSP - AJAX的
    $("#btnFileDown").click(function() {
            var obj = $("#grid")
            var ids = obj.getGridParam("selarrrow");
            var id = obj.jqGrid("getDataIDs");
            var params = new Array();
            
            for(var i = 0; i < ids.length; i++) {
                var data = obj.getRowData(ids[i]);
                params.push(data);
            }
            
            $.ajax({
                type: 'POST',
                url : baseUrl + "fileDownload.et",
                data : {data:JSON.stringify(params)},
                success: function(data, textStatus, xhr) {
                            alert("Success");
                            let disposition = xhr.getResponseHeader('Content-Disposition'); 
                            let filename; 
                            if (disposition && disposition.indexOf('attachment') !== -1) { 
                                let filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/; 
                                let matches = filenameRegex.exec(disposition); 
                                if (matches != null && matches[1]) filename = matches[1].replace(/['"]/g, ''); 
                            } 
                            let blob = new Blob([data]); 
                            let link = document.createElement('a'); 
                            link.href = window.URL.createObjectURL(blob); 
                            link.download = filename; 
                            link.click();
                        },
                error: function(jqXHR, textStatus, errorThrown) {
                            alert("Failed => " + errorThrown);
                        }
            });
        });
  • 服务器
    @RequestMapping("fileDownload.et")
    @Transactional
    public void fileDownload(@RequestParam Map<String, Object> param, ModelMap modelMap, HttpServletResponse response) throws ParseException, FileNotFoundException, IOException {

// After creating ZipFile Code.
            response.setContentType("application/octet-stream");
            response.setHeader("Content-Disposition", "attachment; filename=" +URLEncoder.encode(zipFile.getName(), "UTF-8"));
            response.setHeader("Content-Transfer-Encoding", "binary");
            
            FileInputStream fin = new FileInputStream(zipFile);
            ServletOutputStream fout = response.getOutputStream();
            
            byte b[] = new byte[(int) zipFile.length()];
            int leng = 0;
            
            while ((leng = fin.read(b)) > 0) {
                fout.write(b, 0, leng);
            }
}

搜索所有网站并在 stackoverflow 中提问我的问题 但这并没有回应我任何人。

java jquery ajax xmlhttprequest zip

评论

0赞 user1857654 10/17/2023
尝试在 while 循环后关闭流?fin.close();fout.close();
0赞 King Henry 10/17/2023
感谢您的回复。我解决了这个问题。要使用 blob,我必须升级 jquery 版本。并在 Ajax 中添加了代码 xhrFields。
2赞 Holger 10/17/2023
不要重新发明轮子。使用 Files.copy(zipFile.toPath(), fout);。并养成使用“使用资源试用”的习惯,那么你就不需要记住关闭了。

答: 暂无答案