Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.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从服务器下载大文件_Javascript_Jquery_Html_Amazon Web Services_Downloadfile - Fatal编程技术网

使用Javascript从服务器下载大文件

使用Javascript从服务器下载大文件,javascript,jquery,html,amazon-web-services,downloadfile,Javascript,Jquery,Html,Amazon Web Services,Downloadfile,我使用AWS s3存储文件,并提供从客户端浏览器下载文件的功能 我使用了多种方法下载该文件 使用Ajax调用 使用Ajax调用,首先我调用API从服务器获取文件blob,然后为该blob创建URL并将其交给锚定标记下载 它工作正常,但这里的问题是Ajax调用首先在后台下载内容,然后再将其提供给锚定标记。因此,很难向用户解释这需要花费的时间 代码如下:- var URL = $window.URL || $window.webkitURL || $window.mozURL || $window

我使用AWS s3存储文件,并提供从客户端浏览器下载文件的功能

我使用了多种方法下载该文件

  • 使用Ajax调用
  • 使用Ajax调用,首先我调用API从服务器获取文件blob,然后为该blob创建URL并将其交给锚定标记下载

    它工作正常,但这里的问题是Ajax调用首先在后台下载内容,然后再将其提供给锚定标记。因此,很难向用户解释这需要花费的时间

    代码如下:-

     var URL = $window.URL || $window.webkitURL || $window.mozURL || $window.msURL;
                if (URL) {
                    // IE10+
                    if (navigator.msSaveBlob) {
                        return navigator.msSaveOrOpenBlob(fileBlob, fileName);
                    } else {
                        var downloadLink = document.createElement('a');
                        downloadLink.setAttribute('style', "display: none");
                        downloadLink.setAttribute('href', URL.createObjectURL(fileBlob));
                        downloadLink.setAttribute('download', fileName);
                        document.body.appendChild(downloadLink);
                        downloadLink.click();
                        setTimeout(function () {
                            document.body.removeChild(downloadLink);
                        }, 10);
    
                    }
                }
    
  • 直接定位标记正在下载文件:-
  • 在这种方法中,我只是在锚标记href中提供API URL,因此它可以快速下载我的文件,在API响应后,用户可以在他的浏览器中看到下载进度。但在这种方法中,我无法处理服务器错误,如服务器重新启动或找不到文件。如果API失败,则锚定标记下载HTML文件

    我可以使用cookies处理成功案例,但无法处理错误案例

    以下是该方法的代码:-

     var downloadLink = document.createElement('a');
                downloadLink.setAttribute('style', "display: none");
                downloadLink.setAttribute('href', `/download?id=${id}`);
                downloadLink.setAttribute('download', fileName);
                document.body.appendChild(downloadLink);
                downloadLink.click();
                setTimeout(function () {
                    document.body.removeChild(downloadLink);
                }, 10);
    
    总而言之,我想提高大文件的下载速度

    问题:-

  • 如果我使用第二种方法,可能的错误处理方法

  • 如果我使用第一种方法,那么内容应该在用户浏览器上下载,而不是在后台下载

  • 如果用户位于不同的区域,如何解决延迟问题


  • 我希望我的问题很清楚,如果有什么不清楚的地方,请告诉我。

    #2是最好的解决方案。下载文件404s或HTML错误页面的情况是服务器配置问题,不应该在客户端JS中处理。关于速度/延迟,这又是一个与JS无关的服务器带宽/位置问题。Rory,我们如何配置服务器来处理错误?如果API失败,我只想不下载任何东西。很抱歉,我没用过AWS,所以我帮不了你。然而,维护文件引用和知道文件何时被删除而不链接到它取决于您的代码。除了服务器关闭或服务器重新启动之外,我可以处理其他错误。在这种情况下,客户端和服务器之间将没有连接。