URLSession dataTask / uploadTask 将大量上传拆分为多个请求
URLSession dataTask / uploadTask splitting large uploads into multiple requests
希望有人能阐明这种行为。
- 大文件(比如50mb+)需要上传到服务器
- 上传分为多个 请求,而不是单个请求中的块(参见 Charles 图片)
- 使用其中任何一个都具有相同的行为。
URLSession.shared.dataTask
URLSession.shared.uploadTask
URLSession.shared.uploadTask(withStreamedRequest:)
URLSession.shared.dataTaskPublisher
- 服务器是 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
。
,那么将来任何人都可能会多次调用它的块
这就是导致请求 出现 的原因,就像它们被分开一样,但实际上它是提交图像的缩略图,然后在加载后提交完整尺寸.
鹅被抓住了,但这是一次愚蠢的追逐。希望这对以后的人有所帮助。
希望有人能阐明这种行为。
- 大文件(比如50mb+)需要上传到服务器
- 上传分为多个 请求,而不是单个请求中的块(参见 Charles 图片)
- 使用其中任何一个都具有相同的行为。
URLSession.shared.dataTask
URLSession.shared.uploadTask
URLSession.shared.uploadTask(withStreamedRequest:)
URLSession.shared.dataTaskPublisher
- 服务器是 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
。
这就是导致请求 出现 的原因,就像它们被分开一样,但实际上它是提交图像的缩略图,然后在加载后提交完整尺寸.
鹅被抓住了,但这是一次愚蠢的追逐。希望这对以后的人有所帮助。