问题描述
希望有人可以阐明这种行为。
- 大文件(例如50mb +)需要上传到服务器
- 上传分为多个请求,而不是单个请求中的大块(请参见Charles图片)
- 使用所有这些都具有相同的行为。
-
URLSession.shared.dataTask
-
URLSession.shared.uploadTask
-
URLSession.shared.uploadTask(withStreamedRequest:)
-
URLSession.shared.dataTaskPublisher
- 服务器是节点/快速服务器,在本地进行测试。
// 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)。
编辑:
刚刚发现Content-Length
是保留的标头,无法手动设置。但是,内容长度并未设置为httpBody的大小。
https://developer.apple.com/documentation/foundation/nsurlrequest
解决方法
我想,如果可能的话,您应该将其保留为一个上传请求,并利用后台会话让操作系统为您处理上传。
https://developer.apple.com/documentation/foundation/urlsessionconfiguration/1407496-background
那么您不必担心一个部分上传失败而其他部分上传失败等等。这也简化了服务器的工作,它要么获取文件,要么不上传文件。
,好吧,因为我怀疑这对于手掌来说是一个成熟的问题。网址系统按预期工作,但我是通过以下方式触发的:
PHImageManager.default().requestImage
如果将来返回的第一个将PHImageResultIsDegradedKey
设置为1
,那么对于将来寻找它的任何人,其块可能会多次调用。
这是导致请求出现的样子,就像它们被分开了一样,但实际上,它是在提交图像的缩略图,然后在加载后再提交完整尺寸。
鹅被捉住了,但这是一个愚蠢的追逐。希望这会在将来对某人有所帮助。