ios - 如何在发布数据iOS objective-c 中将图像附件发送到服务器

标签 ios objective-c

在 postman 中可以将数据发送到服务器,但在 Objective-C 中会出现错误。

image1

我尝试从服务器实现这一目标失败了。我提到的下面的链接不起作用。获取错误上传失败。我做错了什么?

Upload image to server ios

how to POST value while uploading image in iOS objective c

我的代码:

NSData *dataImage = UIImageJPEGRepresentation(myImage, 1.0f);

// set your URL Where to Upload Image
NSString *urlString = @"http://xxxxxxxxxxxxxxxx/index.php/API/uploadClaim";

NSDictionary *user = [[NSUserDefaults standardUserDefaults] objectForKey:@"userDetails"];

// Create 'POST' MutableRequest with Data and Other Image Attachment.

NSMutableDictionary* _params = [[NSMutableDictionary alloc] init];
[_params setObject:@"filename"  forKey:@"file_name"];
[_params setObject:@"photo"  forKey:@"file_type"];
[_params setObject:[[user objectForKey:@"user_data"] objectForKey:@"id"]  forKey:@"user_id"];

NSString *BoundaryConstant = @"----------V2ymHFg03ehbqgZCaKO6jy";
NSString* FileParamConstant = @"image";

NSURL* requestURL = [NSURL URLWithString:urlString];

// create request
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
[request setHTTPShouldHandleCookies:NO];
[request setTimeoutInterval:120];
[request setHTTPMethod:@"POST"];

NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", BoundaryConstant];
[request setValue:contentType forHTTPHeaderField: @"Content-Type"];

// post body
NSMutableData *body = [NSMutableData data];

// add params (all params are strings)
for (NSString *param in _params)
{
    [body appendData:[[NSString stringWithFormat:@"--%@\r\n", BoundaryConstant] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", param] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"%@\r\n", [_params objectForKey:param]] dataUsingEncoding:NSUTF8StringEncoding]];
}

// add image data
if (dataImage) {
    [body appendData:[[NSString stringWithFormat:@"--%@\r\n", BoundaryConstant] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"image.jpg\"\r\n", FileParamConstant] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[@"Content-Type: image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:dataImage];
    [body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
}

[body appendData:[[NSString stringWithFormat:@"--%@--\r\n", BoundaryConstant] dataUsingEncoding:NSUTF8StringEncoding]];

// setting the body of the post to the reqeust
[request setHTTPBody:body];

// set the content-length
NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long)[body length]];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
// set URL
[request setURL:requestURL];

NSURLResponse *response = nil;
NSError *requestError = nil;

NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&requestError];
NSDictionary* json = [NSJSONSerialization JSONObjectWithData:returnData options:kNilOptions error:&requestError];

最佳答案

这是我上传一个或多个图像文件的工作代码:

请注意:您应该使用正确的键值在 NSDictionary 中传递图像/文件数据,并且您应该将键名称设置为服务器期望上传调用的名称。
例如,在您的情况下,它是 file

parameters 字典将是与 file 一起发送的其他参数

- (void) performNetworkEventRequestCallWithFileUpload :(NSMutableDictionary*) imagesData : (NSMutableDictionary*)parameters completionBlock:(void (^)(BOOL succeeded, NSDictionary *dict))completionBlock {


NSMutableURLRequest *urlRequest = [[NSMutableURLRequest alloc] init];
[urlRequest setURL:[NSURL URLWithString:BASE_URL]];
[urlRequest setHTTPMethod:@"POST"];
NSString *boundary = @"---------------------------14737809831466499882746641449";
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
[urlRequest addValue:contentType forHTTPHeaderField: @"Content-Type"];
NSMutableData *body = [NSMutableData data];


[parameters enumerateKeysAndObjectsUsingBlock: ^(NSString *key, NSString *object, BOOL *stop) {
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n",key] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"%@",object] dataUsingEncoding:NSUTF8StringEncoding]];
}];


[imagesData enumerateKeysAndObjectsUsingBlock: ^(NSString *key, NSData *object, BOOL *stop) {
    if ([object isKindOfClass:[NSData class]]) {
        if (object.length > 0) {
            [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
            NSString *timeSTamp = [NSString stringWithFormat:@"%@",[NSDate date]];
            [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@.jpg\"\r\n",key,timeSTamp] dataUsingEncoding:NSUTF8StringEncoding]];
            [body appendData:[[NSString stringWithFormat:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
            [body appendData:[NSData dataWithData:object]];
        }

    }
}];


[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[urlRequest setHTTPBody:body];


AFHTTPSessionManager* manager = [AFHTTPSessionManager manager];
manager.responseSerializer.acceptableContentTypes = nil;

NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:urlRequest completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
    if (error) {
        NSLog(@"Error: %@", error);
        completionBlock (NO, responseObject);
    } else {
        NSLog(@"success");
        completionBlock (YES, responseObject);
    }
}];
[dataTask resume];
}

关于ios - 如何在发布数据iOS objective-c 中将图像附件发送到服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47874414/

相关文章:

ios - "No rows found"当没有 UICollectionView 和 UITableView 的行/单元格时

iphone - Dropbox 图片上传结果认证错误

ios - 如何在 iOS App 的所有 View Controller 中重用相同的 UIView

ios - 根据按钮更改 View Controller 中的信息

ios - XCode - 工作区

c++ - opencv 文件中缺少所需的架构 x86_64

objective-c - NSXMLParser 不会在 iOS 4.3 中解析,但在 5.0 中会解析

objective-c - 标题中有两行文本的 UIButton (numberOfLines=2)

ios动画。嵌套动画如何影响持续时间?

ios - 在类型 'remoteMessageDelegate' 的对象上找不到属性 'FIRMessaging *'