Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 正在尝试将zip从后端发送到前端_Javascript_Java_Jquery_Ajax_Ember.js - Fatal编程技术网

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) {
...