多部分/表格.目標數(shù)據(jù)-C/SWIFT因此,這個HTML代碼以正確的格式為我提交數(shù)據(jù)。<form action="https://www.example.com/register.php" method="post" enctype="multipart/form-data">
Name: <input type="text" name="userName"><BR />
Email: <input type="text" name="userEmail"><BR />
Password: <input type="text" name="userPassword"><BR />
Avatar: <input type="file" name="avatar"><BR />
<input type="submit"></form>我已經(jīng)研究了很多關于如何在IOS上發(fā)布多部分/表單數(shù)據(jù)的文章,但是沒有人真正解釋如果有正常的參數(shù)和文件上傳的話該怎么做。你能幫我把這個代碼發(fā)到Obj-C嗎?謝謝!
3 回答

qq_笑_17
TA貢獻1818條經(jīng)驗 獲得超7個贊
創(chuàng)建字典 userName
,userEmail
,和 userPassword
參數(shù)。 NSDictionary *params = @{@"userName" : @"rob", @"userEmail" : @"rob@email.com", @"userPassword" : @"password"};
確定圖像的路徑: NSString *path = [[NSBundle mainBundle] pathForResource:@"avatar" ofType:@"png"];
創(chuàng)建請求: NSString *boundary = [self generateBoundaryString];// configure the requestNSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];[request setHTTPMethod:@"POST"];// set content typeNSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];[request setValue:contentType forHTTPHeaderField: @"Content-Type"];// create bodyNSData *httpBody = [self createBodyWithBoundary:boundary parameters:params paths:@[path] fieldName:fieldName];
這是上面用于構建請求主體的方法: - (NSData *)createBodyWithBoundary:(NSString *)boundary parameters:(NSDictionary *)parameters paths:(NSArray *)paths fieldName:(NSString *)fieldName { NSMutableData *httpBody = [NSMutableData data]; // add params (all params are strings) [parameters enumerateKeysAndObjectsUsingBlock:^(NSString *parameterKey, NSString *parameterValue, BOOL *stop) { [httpBody appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [httpBody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", parameterKey] dataUsingEncoding:NSUTF8StringEncoding]]; [httpBody appendData:[[NSString stringWithFormat:@"%@\r\n", parameterValue] dataUsingEncoding:NSUTF8StringEncoding]]; }]; // add image data for (NSString *path in paths) { NSString *filename = [path lastPathComponent]; NSData *data = [NSData dataWithContentsOfFile:path]; NSString *mimetype = [self mimeTypeForPath:path]; [httpBody appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [httpBody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\r\n", fieldName, filename] dataUsingEncoding:NSUTF8StringEncoding]]; [httpBody appendData:[[NSString stringWithFormat:@"Content-Type: %@\r\n\r\n", mimetype] dataUsingEncoding:NSUTF8StringEncoding]]; [httpBody appendData:data]; [httpBody appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; } [httpBody appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; return httpBody;}
上面使用的實用程序方法如下: @import MobileCoreServices; // only needed in iOS- (NSString *)mimeTypeForPath:(NSString *)path { // get a mime type for an extension using MobileCoreServices.framework CFStringRef extension = (__bridge CFStringRef)[path pathExtension]; CFStringRef UTI = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, extension, NULL); assert(UTI != NULL); NSString *mimetype = CFBridgingRelease(UTTypeCopyPreferredTagWithClass(UTI, kUTTagClassMIMEType)); assert(mimetype != NULL); CFRelease(UTI); return mimetype;}- (NSString *)generateBoundaryString { return [NSString stringWithFormat:@"Boundary-%@", [[NSUUID UUID] UUIDString]];}
然后提交請求。這里有很多選擇。 例如,如果使用 NSURLSession
,您可以創(chuàng)建 NSURLSessionUploadTask
:NSURLSession *session = [NSURLSession sharedSession]; // use sharedSession or create your ownNSURLSessionTask *task = [session uploadTaskWithRequest:request fromData:httpBody completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { if (error) { NSLog(@"error = %@", error); return; } NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"result = %@", result);}];[task resume];
或者您可以創(chuàng)建一個 NSURLSessionDataTask
:request.HTTPBody = httpBody;NSURLSessionTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { if (error) { NSLog(@"error = %@", error); return; } NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"result = %@", result);}];[task resume];
以上假設服務器只是返回文本響應。最好是服務器返回JSON,在這種情況下,您可以使用 NSJSONSerialization
而不是 NSString
方法 initWithData
.同樣,我使用的完成塊表示 NSURLSession
上面,但是也可以使用更豐富的基于委托的版本。但這似乎超出了這個問題的范圍,所以我將由你們來決定。
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];manager.responseSerializer = [AFHTTPResponseSerializer serializer]; // only needed if the server is not returning JSON; if web service returns JSON, remove this lineNSURLSessionTask *task = [manager POST:urlString parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { NSError *error; if (![formData appendPartWithFileURL:[NSURL fileURLWithPath:path] name:@"avatar" fileName:[path lastPathComponent] mimeType:@"image/png" error:&error]) { NSLog(@"error appending part: %@", error); }} progress:nil success:^(NSURLSessionTask *task, id responseObject) { NSLog(@"responseObject = %@", responseObject);} failure:^(NSURLSessionTask *task, NSError *error) { NSLog(@"error = %@", error);}];if (!task) { NSLog(@"Creation of task failed.");}

四季花海
TA貢獻1811條經(jīng)驗 獲得超5個贊
NSDictionary *param;AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];// 1. Create `AFHTTPRequestSerializer` which will create your request.AFHTTPRequestSerializer *serializer = [AFHTTPRequestSerializer serializer];NSMutableURLRequest *request;NSData *fileData;if ([objDoc.url containsString:@".mp4"]) { manager.responseSerializer.acceptableContentTypes = [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"application/json"]; [serializer setValue:@"video/mp4" forHTTPHeaderField:@"Content-Type"]; manager.requestSerializer = serializer;}// 2. Create an `NSMutableURLRequest`.NSLog(@"filename =%@",objDoc.url);request= [serializer multipartFormRequestWithMethod:@"POST" URLString:strUrl parameters:param constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { if ([objDoc.url containsString:@".mp4"]) { [formData appendPartWithFileData:fileData name:@"File" fileName:@"video.mp4" mimeType:@"video/mp4"]; }else{ [formData appendPartWithFileData:fileData name:@"File" fileName:@"image.jpeg" mimeType:@"image/jpeg"]; }} error:nil];// 3. Create and use `AFHTTPRequestOperationManager` to create an `AFHTTPRequestOperation` from the `NSMutableURLRequest` that we just created.self.objeDocument.isUploading = [NSNumber numberWithInt:1];self.operation = [manager HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"Success %@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Error!" message:@"The document attached has failed to upload." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; [alert show]; [self.operation cancel]; NSLog(@"Failure %@", error.description); }];// 4. Set the progress block of the operation.[self.operation setUploadProgressBlock:^(NSUInteger __unused bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) { NSLog(@"Wrote %lld/%lld", totalBytesWritten, totalBytesExpectedToWrite); float progress = (float)totalBytesWritten/(float)totalBytesExpectedToWrite;}];// 5. Begin![self.operation start];
- 3 回答
- 0 關注
- 530 瀏覽
添加回答
舉報
0/150
提交
取消