正在尝试从iOS将文件上载到OneDrive。什么';我的要求有什么问题?

正在尝试从iOS将文件上载到OneDrive。什么';我的要求有什么问题?,ios,objective-c,nsurlconnection,nsmutableurlrequest,onedrive,Ios,Objective C,Nsurlconnection,Nsmutableurlrequest,Onedrive,我正在尝试使用BITS协议将文件上载到OneDrive。文档中描述了如下请求: 完整的文档页面如下所示: 实际上,它处理的是按块上传文件,但由于块的大小必须不大于60MB,所以我尝试将一个小文件作为单个chunck上传。这是我的密码: NSString *path = [[NSBundle mainBundle] pathForResource:@"download" ofType:@"jpeg"]; self.data = [NSData dataWithConte

我正在尝试使用
BITS
协议将文件上载到
OneDrive
。文档中描述了如下请求:

完整的文档页面如下所示:

实际上,它处理的是按块上传文件,但由于块的大小必须不大于60MB,所以我尝试将一个小文件作为单个chunck上传。这是我的密码:

    NSString *path = [[NSBundle mainBundle] pathForResource:@"download" ofType:@"jpeg"];
    self.data      = [NSData dataWithContentsOfFile:path];

    NSString *boundary  = @"---------------------------14737809831466499882746641449";
    NSMutableData *body = [NSMutableData data];

    [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: attachment; name=\"image\"; filename=\"image.jpg\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[NSData dataWithData:self.data]];
    [body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];

    length = body.length;

    NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:self.urlString]];
    urlRequest.HTTPMethod           = @"POST";

    [urlRequest setValue:@"BITS_POST" forHTTPHeaderField:@"X-Http-Method-Override"];
    [urlRequest setValue:self.accessToken forHTTPHeaderField:@"Authorization"];
    [urlRequest setValue:self.sessionId forHTTPHeaderField:@"BITS-Session-Id"];
    [urlRequest setValue:@"Fragment" forHTTPHeaderField:@"BITS-Packet-Type"];
    [urlRequest setValue:[NSString stringWithFormat:@"%d", length] forHTTPHeaderField:@"Content-Length"];
    [urlRequest setValue:[NSString stringWithFormat:@"0-%d/%d", length - 1, length] forHTTPHeaderField:@"Content-Range"];

    urlRequest.HTTPBody = body;

    self.uploadConnection = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self startImmediately:YES];
无论我尝试什么,我都会收到400个错误和
BadArgument
作为
X-ClientErrorCode
。参数
self.accessToken
self.sessionId
有效,它们刚从SDK接收。我不知道那里出了什么问题。有人能帮我吗?我可能做错了什么?

问题是“内容范围”不正确-它需要在范围前面包含“字节”

原始答案

看起来您既没有在片段之前发送创建会话请求,也没有在片段之后发送关闭会话请求。即使只打算发送一个片段,也需要在发送片段之前创建会话。如果您知道只发送一个片段,那么最好使用直接上传,以避免不必要的往返:


我确实创建了会话,布拉德!看,我使用的是会话id。创建会话没有问题,效果很好。我需要上传区块(我也试过了,结果是一样的,在这里我只使用一个文件作为一个区块,我认为在这种情况下这无关紧要),所以我不需要直接上传,我需要比特。你曾经在iOS中这样做过吗?呸,对不起,我只是假设这是整个复制过程,没有注意到会话id!:你能试着用一个笔直的身体而不是用边界吗?我已经试过了。我试过了,没有界限。还是400。我什么都试过了,今天我已经花了6个小时没有运气了。你曾经用任何语言做过吗?我只需要一个工作示例。它可能是您的内容范围标题。。。尝试在范围前面添加“bytes”(例如“bytes 0-%d/$d”)Brad,就是这样!!!你是我的救世主!编辑你的答案,我会接受的。