繁体   English   中英

如何使用HTTP HEADERS和使用Objective-C的FILE发送PUT请求?

[英]How to send PUT request with HTTP HEADERS and a FILE with Objective-C?

我是Objective-C的新手,请让我详细说明一下我在做什么...

我正在尝试使用PUT请求将文件上传到OneDrive。

PUT请求必须包含

Http标题

一驱动器文档

内容长度7919

内容范围字节0-7918 / 7919

并使用这些标头将文件上传

PUT https://sn3302.up.1drv.com/up/fe6987415ace7X4e1eF866337
Content-Length: 7919
Content-Range: bytes 0-7918/7919

<bytes 0-7918 of the file>

以下是使用Chrome POSTMAN的整个PUT请求的屏幕截图

我正在尝试通过以下标题发出PUT请求:

在此处输入图片说明

和一个文件

在此处输入图片说明

您能指导我如何使用Objective-C进行上述操作吗?

问题

POSTMAN一切正常,但是当我尝试使用Objective-C进行操作时,文件没有上传,得到的结果如下:

{“错误”:{“代码”:“ invalidRequest”,“消息”:“声明的片段长度与提供的字节数不匹配”}}

目标C代码

-(void)uploadFile:(NSString*)uploadUrl
{
    NSString *urlString = uploadUrl;

    NSData* file =  [NSData dataWithContentsOfFile: [@"/Users/username/Desktop/s.sql" stringByExpandingTildeInPath]];

    NSString* fileName = @"s.sql";


//

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    [request setURL:[NSURL URLWithString:urlString]];
    [request setHTTPMethod:@"PUT"];


    NSString *boundary = @"---------------------------14737809831466499882746641449";
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];
    [request addValue:contentType forHTTPHeaderField: @"Content-Type"];
    [request addValue:@"7919" forHTTPHeaderField: @"Content-Length"];
    [request addValue:@"bytes 0-7918/7919" forHTTPHeaderField: @"Content-Range"];


    NSMutableData *putData = [NSMutableData data];
    [putData appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];

    // Append the file
    [putData appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [putData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"fileupload\"; filename=\"%@\"\r\n", fileName]dataUsingEncoding:NSUTF8StringEncoding]];
    [putData appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    [putData appendData:[NSData dataWithData:file]];



    // Close
    [putData appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];

    // Append
    [request setHTTPBody:putData];


    NSError *err;
    NSURLResponse *response;

    NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err];

    NSString *resSrt = [[NSString alloc]initWithData:responseData encoding:NSASCIIStringEncoding];


}

多亏了上帝,我终于找到了办法。 下面给出的是经过编辑且有效的代码:

-(void)uploadFile:(NSString*)uploadUrl
{
    NSString *urlString = uploadUrl;

    NSData* file =  [NSData dataWithContentsOfFile: [@"/Users/username/Desktop/s.sql" stringByExpandingTildeInPath]];

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    [request setURL:[NSURL URLWithString:urlString]];
    [request setHTTPMethod:@"PUT"];


    [request addValue:@"7919" forHTTPHeaderField: @"Content-Length"];
    [request addValue:@"bytes 0-7918/7919" forHTTPHeaderField: @"Content-Range"];


    NSMutableData *putData = [NSMutableData data];
    [putData appendData:[NSData dataWithData:file]];


    // Append
    [request setHTTPBody:putData];


    NSError *err;
    NSURLResponse *response;

    NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err];

    NSString *resSrt = [[NSString alloc]initWithData:responseData encoding:NSASCIIStringEncoding];
    NSLog(resSrt);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM