URLSession dataTask / uploadTask 将大量上传拆分为多个请求

URLSession dataTask / uploadTask splitting large uploads into multiple requests

希望有人能阐明这种行为。

  1. 大文件(比如50mb+)需要上传到服务器
  2. 上传分为多个 请求,而不是单个请求中的块(参见 Charles 图片)
  3. 使用其中任何一个都具有相同的行为。
  1. 服务器是 node / express,在本地测试。
// Express server route
app.post('/save', (req, res, next) => {

   // Receives twice for the same upload
}

示例尝试

    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    request.setValue("application/octet-stream", forHTTPHeaderField: "content-type")
    request.setValue("chunked", forHTTPHeaderField: "transfer-encoding")
    request.httpBodyStream = InputStream(data: package)
    let task = self.session.uploadTask(withStreamedRequest: request)
    self.streamingTask = task
    task.resume()

这正常吗?这对我来说似乎很奇怪,并且很难在最后将数据放在一起。 我已经设置了各种 headers 以查看是否这是我所缺少的,例如 Content-Length,尝试了多种编码(multipart/form、json)。

编辑: 刚发现Content-Length是保留的header,不能手动设置。但是内容长度没有设置为 httpBody 的大小。

https://developer.apple.com/documentation/foundation/nsurlrequest

我想说的是,如果可能,您应该将其保留为一个上传请求,并利用后台会话让 OS 为您处理上传。

https://developer.apple.com/documentation/foundation/urlsessionconfiguration/1407496-background

那么您就不必担心一个部分上传失败而其他部分上传失败等等。它还为您的服务器简化了一些事情,它要么获取文件,要么不获取文件。

好吧,正如我所怀疑的那样,这是一个适合脸掌的问题。 url 系统按预期工作,但我是通过

触发的
PHImageManager.default().requestImage

如果第一个 returns 将 PHImageResultIsDegradedKey 设置为 1

,那么将来任何人都可能会多次调用它的块

Apple Doc Reference

这就是导致请求 出现 的原因,就像它们被分开一样,但实际上它是提交图像的缩略图,然后在加载后提交完整尺寸.

鹅被抓住了,但这是一次愚蠢的追逐。希望这对以后的人有所帮助。