Javascript 正在尝试将zip从后端发送到前端
在我的Javascript 正在尝试将zip从后端发送到前端,javascript,java,jquery,ajax,ember.js,Javascript,Java,Jquery,Ajax,Ember.js,在我的ember.jswebapp中,用户可以选择下载zip文件。单击按钮后,将触发一个操作,该操作将向后端服务器发送请求,后端服务器将生成zip并返回它。理想情况下,zip应该自动下载 在我的后端端点中,我返回 return Response .ok(FileUtils.readFileToByteArray(new File(tmpZipFilename))) // tmpZipFilename is a String .type("application/z
ember.js
webapp中,用户可以选择下载zip文件。单击按钮后,将触发一个操作,该操作将向后端服务器发送请求,后端服务器将生成zip并返回它。理想情况下,zip应该自动下载
在我的后端端点中,我返回
return Response
.ok(FileUtils.readFileToByteArray(new File(tmpZipFilename))) // tmpZipFilename is a String
.type("application/zip")
.header("Content-Disposition", "attachment; filename=\"" + finalZipFilename + "\"")
.build();
在前端,我已经(改编自)
响应标题如下所示:
HTTP/1.1 200 OK
X-Powered-By: Undertow/1
Cache-Control: no-store
Date: Tue, 19 Feb 2019 16:34:35 GMT
Server: WildFly/10
Content-Type: application/zip
Content-Disposition: attachment; filename="filename.zip"
Connection: close
Transfer-Encoding: chunked
我已经确认后端部分中的
tmpZipFilename
确实指向了正确的zip文件。当用户单击下载按钮时,一个名为myFile.zip
的文件确实被下载。但是,下载的文件不可解压缩,并且与tmpZipFilename
指向的正确文件大小不同。我做错了什么?答案是简单地添加数据类型:“arraybuffer”
:
...
jquery.ajax({
url: 'myUrl',
data: formData,
processData: false,
contentType: false,
dataType: 'arraybuffer',
beforeSend: function(xhr) {
...
实际上,要下载文件,最好的解决方案就是调用。如果您的API返回的是实际文件,并且您的内容类型和配置设置正确,您可以在前端创建到API端点的自然链接,或者使用标准表单而不是AJAX请求,因为文件下载会触发,你会呆在原来的地方,就寡妇而言 选择一:
这可以通过将参数绑定到url字符串来实现。但是,我建议不要使用这种方法,除非您有办法创建已签名的单次使用GET身份验证令牌,因为您不应该将访问令牌发送到任何可读的地方
选项2是创建一个通用HTML表单,其中操作是api端点,您可以在post数据中传递令牌。如果API endpoint simple返回正确的文件,则在提交表单时应下载该文件,并且您应该能够停留在同一页面上
您没有将这些字符串正确地连接为一个字符串。“附件;文件名=\”“+finalZipFilename+”\”“您能用文本编辑器查看一下zip文件吗?可能是服务器错误的html文件。看起来像是包含大量�代码>sI在文本编辑器视图中对好的和坏的拉链进行了区分。它们几乎完全相同,只是坏邮政编码中的每一行都缺少一些随机的�代码>s
...
jquery.ajax({
url: 'myUrl',
data: formData,
processData: false,
contentType: false,
dataType: 'arraybuffer',
beforeSend: function(xhr) {
...