【问题标题】:Send File in Chunks with Metadata使用元数据以块形式发送文件
【发布时间】:2014-04-21 18:06:23
【问题描述】:

我正在编写一个 Web 应用程序和一个 OS X 应用程序,它们会将文件上传到服务器。

网络应用程序使用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);
    }];
}

但这只是试图在一个请求中发送整个文件,这是不可接受的,因为服务器会在大量请求时耗尽内存。

我想知道是否有类似 FlowJS 之类的目标 C,或者是否有某种方法可以在每次调用的 AFNetworking 中包含该信息。

【问题讨论】:

标签: objective-c networking file-upload afnetworking multipartform-data


【解决方案1】:

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

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

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

你为什么不这样做,S3 会:

使用 ID 作为响应发起上传请求。然后使用该上传 ID 发送一个块。如果完成,服务器会响应并发送下一部分。这样做你有一个握手。

【讨论】:

  • 您能否更详细地解释一下 AWS 的工作方式?据我了解,您将一个块上传到 S3,发送一个带有请求的 ID。一旦 AWS 收到,它会使用相同的 ID 进行响应,通知您它已成功接收到该块。给定该 ID,客户端应该知道接下来要发送哪个块。然后在完成时,客户端会发送一个特殊请求,通知 AWS 该请求已完成。对吗?
  • 你有“成功”和“失败”。您可以将文件拆分成块并以链的形式发送(以简化文件传输)。唯一的问题是如何处理服务器上的数据块。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-06
相关资源
最近更新 更多