如何发送带有 HTTP HEADERS 的 PUT 请求和带有 Objective-C 的 FILE?
How to send PUT request with HTTP HEADERS and a FILE with Objective-C?
我是 Objective-C 的新手,请让我详细说明我在做什么...
我正在尝试使用 PUT 请求将文件上传到 OneDrive。
PUT 请求必须包含
HttpHeaders
content-length 7919
content-range 字节 0-7918/7919
并使用这些 headers 将上传一个文件
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 请求 headers:
和一个文件
能否指导我如何使用 Objective-C
执行上述操作
问题
使用 POSTMAN 时一切正常,但是当我尝试使用 Objective-C 时,文件没有上传,我得到以下结果:
{"error":{"code":"invalidRequest","message":"Declared fragment length
does not match the provided number of bytes"}}
Objective 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);
}
我是 Objective-C 的新手,请让我详细说明我在做什么...
我正在尝试使用 PUT 请求将文件上传到 OneDrive。
PUT 请求必须包含
HttpHeaders
content-length 7919
content-range 字节 0-7918/7919
并使用这些 headers 将上传一个文件
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 请求 headers:
和一个文件
能否指导我如何使用 Objective-C
执行上述操作问题
使用 POSTMAN 时一切正常,但是当我尝试使用 Objective-C 时,文件没有上传,我得到以下结果:
{"error":{"code":"invalidRequest","message":"Declared fragment length does not match the provided number of bytes"}}
Objective 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);
}