HTTP POST для Imageshack - PullRequest
0 голосов
/ 31 мая 2009

В настоящее время я загружаю изображения на свой сервер через HTTP POST. Все работает нормально, используя код ниже.

NSString *UDID = md5([UIDevice currentDevice].uniqueIdentifier);
NSString *filename = [NSString stringWithFormat:@"%@-%@", UDID, [NSDate date]];
NSString *urlString = @"http://taptation.com/stationary_data/index.php";
request= [[[NSMutableURLRequest alloc] init] autorelease];
[request setURL:[NSURL URLWithString:urlString]];
[request setHTTPMethod:@"POST"];
NSString *boundary = @"---------------------------14737809831466499882746641449";
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
[request addValue:contentType forHTTPHeaderField: @"Content-Type"];
NSMutableData *postbody = [NSMutableData data];
[postbody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[postbody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\"; filename=\"%@.jpg\"\r\n", filename] dataUsingEncoding:NSUTF8StringEncoding]];
[postbody appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[postbody appendData:[NSData dataWithData:imageData]];
[postbody appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[request setHTTPBody:postbody];

NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];
NSLog(returnString);

Однако, когда я пытаюсь преобразовать это для работы с Image Shacks XML API, он ничего не возвращает. Направления от ImageShack ниже.

Отправьте следующие переменные через POST в imageshack. нас /index.php

FileUpload; (изображение) xml = "да"; (указывает на возврат XML) печенье; (регистрационный код, необязательно)

Кто-нибудь знает, куда я должен идти отсюда?

Ответы [ 2 ]

2 голосов
/ 16 февраля 2011

Это заняло у меня некоторое время, но вам нужно использовать ASIHTTPREQUEST!

- (void)uploadToImageShack {
NSAutoreleasePool *paul = [[NSAutoreleasePool alloc] init];
UIImage *tempImage = self.selectedimage;
ASIFormDataRequest *request = [[[ASIFormDataRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.imageshack.us/upload_api.php"]] autorelease];
NSData *imageData = UIImagePNGRepresentation(tempImage);
[request setFile:imageData withFileName:@"image" andContentType:@"image/png" forKey:@"fileupload"];
[request setPostValue:@"yes" forKey:@"xml"];
[request setPostValue:@"3ZQ7C09K708fce677d9cadee04811cfcbdf63361" forKey:@"key"];
[request setUseCookiePersistence:NO];
[request startSynchronous];
NSError *error = [request error];
if (error) {
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"Dismiss" otherButtonTitles:nil];
    [alert show];
    [alert release];
}
else if (!error) {
    if ([request responseString]) {
        parser = [[NSXMLParser alloc] initWithData:[[NSData alloc] initWithData:[request responseData]]];
        [parser setDelegate:self];
        [parser parse];
    }
}   
[paul drain];
}
2 голосов
/ 31 мая 2009

Возможно, вы захотите использовать ASIHTTPRequest , так как он создаст тело для отправки данных формы для вас с гораздо меньшими хлопотами и может передавать тело запроса с диска, поэтому вы сэкономите память, когда загрузка больших изображений.

Быстрый Google нашел это , что, по-видимому, предполагает, что вы должны публиковать в /upload_api.php, а не в /index.php.

Что-то вроде этого, вероятно, будет хорошим началом:

ASIFormDataRequest *request = [[[ASIFormDataRequest alloc] initWithUrl:[NSURL URLWithString:@"http://www.imageshack.us/upload_api.php"]] autorelease];
[request setFile:@"/path/to/file" forKey:@"fileupload"];
[request setPostValue:@"yes" forKey:@"xml"];
[request setPostValue:@"blahblah" forKey:@"cookie"];
//It looks as though you probably need these too
[request setPostValue:@"me@somewhere.com" forKey:@"email"];
[request setPostValue:@"blah" forKey:@"key"];
[request start];
if ([request error]) {
    NSLog(@"%@",[request error]);
} else {
    NSLog([request responseString]); // The xml that got sent back
}

Предупреждение: не проверено!

Я использовал синхронный запрос, потому что вы это сделали, но вам почти наверняка следует использовать асинхронный запрос (очередь с ASIHTTPRequest).

...