gpt4 book ai didi

objective-c - 使用元数据分块发送文件

转载 作者:太空狗 更新时间:2023-10-30 03:46:02 26 4
gpt4 key购买 nike

我正在编写一个网络应用程序和一个将文件上传到服务器的 OS X 应用程序。

Web 应用程序使用 FlowJS处理将文件发送到服务器。连同每个请求,它都会发送 block 编号、 block 大小、总文件大小、文件名等。这很棒,因为在幕后我正在将这些数据上传到 S3 并使用它确定文件何时完成上传的信息。此外,由于数据以 block 的形式出现,我不必将整个文件存储在服务器的内存中。

对于具有 objective-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);
}];
}

但这只是尝试在一个请求中发送整个文件,这是 Not Acceptable ,因为服务器会在大请求时耗尽内存。

我想知道的是,对于 Objective-C 是否有类似 FlowJS 的东西,或者是否有某种方法可以在每次调用时使用 AFNetworking 包含该信息。

最佳答案

我不认为你可以很容易地自动做到这一点。 (如果有人知道如何做到这一点,我想知道答案。)

Multipart 没有帮助,因为它构建了内容,而不是传输。将其视为文本文档中的段落:它们为文本提供了结构,但它仍然是一个文件。

这导致了真正的问题:您希望拥有固定大小的 block ,并在处理完一个 block (上传到 S3)后发送一个 block ,然后发送下一个 block ,依此类推。客户端如何知道第一个 block 已被处理?当服务器收到第一个数据时,HTTP 无法发送新数据。当发送第一个 block 时(在途中),您发送下一个 block 。我不确定,AFNetworking 是否保证在发送第一部分后请求下一部分……也许它想收集小部分。

你为什么不这样做,S3 可以:

以ID作为响应发起上传请求。然后使用该上传 ID 发送一个 block 。如果完成,服务器响应并发送下一部分。这样您就握手了。

关于objective-c - 使用元数据分块发送文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22439054/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com