eli*_*iot 6 networking file-upload multipartform-data objective-c afnetworking
我正在编写一个Web应用程序和一个OS X应用程序,它将文件上传到服务器.
Web应用程序使用FlowJS来处理将文件发送到服务器.与每个请求一起,它发送块号,块大小,总文件大小,文件名等.这很好,因为在幕后我将这些数据上传到S3并且我使用此信息来确定文件何时是完成上传.此外,由于数据是以块的形式存在的,因此我不必将整个文件存储在服务器的内存中.
对于具有目标c的OS X,我计划使用AFNetworking.我尝试使用分段上传:
-(void)uploadFileWithUrl:(NSURL*)filePath {
AFHTTPRequestOperationManager*manager = [AFHTTPRequestOperationManager manager];
[manager POST:@"http://www.example.com/files/upload" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
[formData appendPartWithFileURL:filePath name:@"blob" error:nil];
} success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"Success: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
}
Run Code Online (Sandbox Code Playgroud)
但这只是试图在一个请求中发送整个文件,这是不可接受的,因为服务器将在大量请求上耗尽内存.
我想知道的是,对于目标C有什么类似FlowJS,或者是否有某种方法可以将AFNetworking中的信息包含在每个呼叫中.
Ami*_*wad -1
我认为您不能很容易地自动完成此操作。(如果有人知道如何做到这一点,我想知道答案。)
\n\n多部分没有帮助,因为它构建内容,但不构建传输。将其视为文本文档中的段落:它们为文本提供了一种结构,但它仍然是一个文件。
\n\n这导致了真正的问题:您希望拥有固定大小的块,并在处理一个块(上传到 S3)后发送一个块,然后发送下一个块,依此类推。客户端如何知道第一个块已被处理?当服务器收到第一个数据时,HTTP 的工作方式不是发送新数据。当第一个块被发送时(在途中),您发送下一个块。我不确定,AFNetworking 是否保证在发送第一部分 \xe2\x80\xa6 后请求下一部分,也许它想收集小部分。
\n\n为什么不这样做,S3 可以:
\n\n发起上传请求,并使用 ID 作为响应。然后使用该上传 ID 发送一个块。如果完成,服务器响应并发送下一部分。这样做你就握手了。
\n