Chrome与服务人员的文件下载损坏

时间:2018-12-27 07:56:34

标签: angular spring google-chrome download service-worker

我们有一个带有服务人员的Angular Web App,用于一些基本的缓存。后端是一个Spring Boot Java应用程序,它通过REST接口提供各种服务。除其他外,我们还有GET请求来下载文件。

一切正常工作了几个月,但是从Chrome v71开始,我们遇到了以下问题:如果我们通过REST服务下载文件,下载本身就完成了,但是如果我们尝试打开它(例如PDF),这样做由于文件已损坏而无法工作。原因是文件未完全下载。例如,我们尝试使用大小为539kb的PDF。在几次下载过程中,我们总是得到大小不同的文件,分别为506kb,504kb,518kb...。有时,我们还会获得完整的文件,然后可以毫无问题地打开它。这仅在Chrome中发生(我们无法在FF,Safari,IE等其他任何浏览器中复制)。经过数小时的调试,我们发现这与服务人员有关。如果我们取消注册服务人员并随后触发下载,我们将始终获得完整的文件。

我检查了Chrome v71的所有更改,发现其中一项与Background Fetch API-> https://www.chromestatus.com/feature/5712608971718656有关。

在后端为GET服务创建ResponseEntity(我们已经检查了Content-Length属性是否始终设置正确):

private ResponseEntity<Resource> getResourceResponseEntity(ReportDTO pdf) {
    ByteArrayResource resource = new ByteArrayResource(pdf.getData());
    return ResponseEntity.ok()
            .header(CONTENT_DISPOSITION, "attachment; filename=" + pdf.getFilename())
            .header(CONTENT_LENGTH, 
String.valueOf(resource.contentLength()))
            .contentType(APPLICATION_PDF)
            .body(resource);
}

我们的服务工作者配置(基本上,我们缓存了一些资产,并排除了每个/ api / ** URL(文件下载URL满足此模式):

{
    "index": "/index.html",
    "assetGroups": [
        {
            "name": "app",
            "installMode": "prefetch",
            "resources": {
                "files": ["/assets/favicon.ico", "/index.html", "/*.css", "/*.js"]
            }
        },
        {
            "name": "assets",
            "installMode": "lazy",
            "updateMode": "prefetch",
            "resources": {
                "files": ["/assets/**", "!/assets/favicon.ico"]
            }
        }
    ],
    "dataGroups": [
        {
            "name": "api-disable-cache",
            "urls": ["/api/**", "/isAlive"],
            "cacheConfig": {
                "strategy": "freshness",
                "maxSize": 0,
                "maxAge": "0u"
            }
        }
    ]
}

我们通过打开一个新的浏览器窗口来下载文件,该窗口带有GET请求的相应URL:

window.open(url, '_blank');

我还将打开Chrome的票证,以便他们可以检查这是否需要在service worker实施中修复。无论如何,如果有人遇到类似问题或知道如何解决此问题(在不完全禁用服务工作者的情况下,实际上是我们当前的解决方法),请告诉我。谢谢!

更新: 相应的Chromium问题:https://bugs.chromium.org/p/chromium/issues/detail?id=917958&q=corrupt&colspec=ID%20Pri%20M%20Stars%20ReleaseBlock%20Component%20Status%20Owner%20Summary%20OS%20Modified

0 个答案:

没有答案