Mac OS NSURLConnection в итерации - PullRequest
2 голосов
/ 16 декабря 2010

Мне действительно нужна помощь в решении проблемы с NSURLConnection в итерации. Я создаю приложение командной строки в Mac OS, которое отправляет JPG на сервер. Теперь каждые 30 секунд он проверяет наличие новых изображений на компьютере, если находит, отправляет их на наш сервер с помощью HTTP Post (я посмотрел на FTP, но не нашел большой поддержки, и HTTP, кажется, быстрее для небольших файлов). Так что происходит, что POST будет отправлять данные правильно каждую другую итерацию, но время ожидания для остальных. Я понятия не имею, почему это будет делать это. Я попробовал и синхронный и асинхронный запрос, и они оба имеют одинаковый результат. Вот функция, которая вызывается для отправки изображений:

+ (BOOL)uploadImage:(NSData *)imageData filename:(NSString *)filename{

        NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] retain];

     NSString *upload_url = [self getPlistValue:@"config.plist" withKey:@"upload_url"];
     NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@", 
                [self getPlistValue:@"config.plist" withKey:@"upload_protocol"],
                upload_url]];
     [request setURL:url];
     [request setTimeoutInterval:10];
        [request setHTTPMethod:@"POST"];
     [request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];

        NSString *boundary = [NSString stringWithFormat:@"---------------------------14737809831466499882%d",arc4random() % 74];
        NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
        [request addValue:contentType forHTTPHeaderField: @"Content-Type"];

     NSMutableData *body = [NSMutableData data];
        [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
     [body appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"client\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
     [body appendData:[[NSString stringWithString:[self getPlistValue:@"config.plist" withKey:@"client_dir"]] dataUsingEncoding:NSUTF8StringEncoding]];
     [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];

     [body appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"fname\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
     [body appendData:[[NSString stringWithString:filename] dataUsingEncoding:NSUTF8StringEncoding]];
     [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];

        [body appendData:[[NSString stringWithString:[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"jpg_img\"; filename=\"%@.%@\"\r\n",filename,@"jpg"]] dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[[NSString stringWithString:@"Content-Type: image/jpeg\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[NSData dataWithData:imageData]];
        [body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
        [request setHTTPBody:body];

     NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
     NSString *returnString = [[[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding] autorelease];
     [body release];
     [request release];
     [returnData release];
     return ([returnString isEqualToString:@"DONE"]); 
}

Что меня очень огорчает, так это то, что если я закомментирую часть тела ImageData, каждый запрос будет успешно выполнен (поэтому я знаю, что он не имеет никакого отношения к принимающему серверу). Я также знаю, что ImageData является допустимым JPG, потому что перед этим вызовом функции я сохраняю его обратно на диск (для проверки работоспособности).

У кого-нибудь есть идеи, почему это происходит? Любое понимание будет с благодарностью.

ОБНОВЛЕНИЕ: я смог заставить его работать, внедрив пакет ASIHTTPRequest , полагаю, я неправильно настроил параметры формы из нескольких частей.

1 Ответ

0 голосов
/ 16 декабря 2010

Проверить эту ссылку: http://www.cimgf.com/2010/02/12/accessing-the-cloud-from-cocoa-touch/

Я не могу точно определить вашу проблему, но соответствующий фрагмент кода по приведенной выше ссылке, я думаю, поможет вам:

NSData *imageData = UIImagePNGRepresentation([UIImage imageNamed@"localimage.png"]);

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] 
        initWithURL:[NSURL 
        URLWithString:@"http://www.cimgf.com/testpostimage.php"]]; // Not a real URL. 

[request setHTTPMethod:@"POST"];
[request setValue:@"image/png" 
        forHTTPHeaderField:@"Content-type"];
[request setValue:[NSString stringWithFormat:@"%d", 
        [imageData length]] 
        forHTTPHeaderField:@"Content-length"];
[request setHTTPBody:imageData];

[[NSURLConnection alloc] initWithRequest:request delegate:self];
...