URLSession dataTask / uploadTask将大型上传分成多个请求 尝试示例

问题描述

希望有人可以阐明这种行为。

  1. 大文件(例如50mb +)需要上传到服务器
  2. 上传分为多个请求,而不是单个请求中的大块(请参见Charles图片)
  3. 使用所有这些都具有相同的行为。
  • URLSession.shared.dataTask
  • URLSession.shared.uploadTask
  • URLSession.shared.uploadTask(withStreamedRequest:)
  • URLSession.shared.dataTaskPublisher
  1. 服务器是节点/快速服务器,在本地进行测试。
// 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()

这正常吗?在我看来,这很奇怪,并且很难将数据汇总在一起。 我设置了各种标头来查看是否缺少我想要的标头,例如Content-Length,并尝试了多种编码(multipart / form,json)。

Charles Image

编辑: 刚刚发现Content-Length是保留的标头,无法手动设置。但是,内容长度并未设置为httpBody的大小。

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

解决方法

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

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

那么您不必担心一个部分上传失败而其他部分上传失败等等。这也简化了服务器的工作,它要么获取文件,要么不上传文件。

,

好吧,因为我怀疑这对于手掌来说是一个成熟的问题。网址系统按预期工作,但我是通过以下方式触发的:

PHImageManager.default().requestImage

如果将来返回的第一个将PHImageResultIsDegradedKey设置为1,那么对于将来寻找它的任何人,其块可能会多次调用。

Apple Doc Reference

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

鹅被捉住了,但这是一个愚蠢的追逐。希望这会在将来对某人有所帮助。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...