2013-06-13 4 views
0

Я хочу отправить данные в формате pdf, чтобы сервер с некоторыми пользовательскими данными также напоминал userId и имя_файла.Загрузить pdf-данные на сервер

Я пробовал 2 решения, но не получил файл pdf на бэкэнд. Даже у меня есть файл pdf в каталоге документов, и он успешно открывается.

Пробовал 1:

-(void)uploadDock{ 
NSString *fileName =[NSString stringWithFormat: @"%@.pdf",@"Inspection"]; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *path = [documentsDirectory stringByAppendingPathComponent:fileName]; 
    NSData *data=[NSData dataWithContentsOfFile:path]; 
    NSString *content=[data base64EncodedString]; 
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 


if ([self.responseData retainCount]) { 
    NSLog(@"Do nothing"); 
    [self.responseData release]; 
} 
self.responseData=[[NSMutableData alloc]init]; 
NSURL *url = [NSURL URLWithString:@"http://abcgroup.delivery-projects.com:81/api/index.php?keyword=docinsert"]; 

//self.request = [NSMutableURLRequest requestWithURL:url 
//cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; 

self.request = [NSMutableURLRequest requestWithURL:url]; 
NSLog(@"Requst %@",request); 
NSString *userid=[userDefaults valueForKey:@"UIDD"]; 
NSString *title=fileName; 
NSString *docname=fileName; 
NSString *size=[NSString stringWithFormat:@"%d",[data length]]; 
NSString *post = [NSString stringWithFormat:@"userid=%@&title=%@&docname=%@&size=%@&content=%@",userid,title,docname,size,content]; 
NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding]; 
[self.request setHTTPMethod:@"POST"]; 

//NSString *POSTBoundary = [NSString stringWithFormat:@"0xKhTmLbOuNdArY"]; 
//[self.request addValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@\r\n", POSTBoundary] forHTTPHeaderField:@"Content-Type"]; 

[self.request setValue:[NSString stringWithFormat:@"%d", postData.length] forHTTPHeaderField:@"Content-Length"]; 
[self.request setValue:@"application/x-www-form-urlencoded charset=utf-8" forHTTPHeaderField:@"Content-Type"]; 
[self.request setHTTPBody:postData]; 
[NSURLConnection connectionWithRequest:self.request delegate:self]; 
} 

Пробовал 2:

Я читал NSData из PDF-файла из каталога документов. ///// - (Недействительными) uploadDock {

self.condition=3; 

NSString *fileName =[NSString stringWithFormat: @"%@.pdf",@"Inspection"]; 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *path = [documentsDirectory stringByAppendingPathComponent:fileName]; 
NSData *data=[NSData dataWithContentsOfFile:path]; 

NSString *content=[data base64EncodedString]; 
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 

if ([self.responseData retainCount]) { 
    NSLog(@"Do nothing"); 
} 
else{ 
    self.responseData=[[NSMutableData alloc]init]; 
} 

NSURL *url = [NSURL URLWithString:@"http://abcgroup.delivery-projects.com:81/api/index.php?keyword=docinsert"]; 
//self.request = [NSMutableURLRequest requestWithURL:url 
    //          cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; 
self.request = [NSMutableURLRequest requestWithURL:url]; 
NSLog(@"Requst %@",request); 
NSString *userid=[userDefaults valueForKey:@"UIDD"]; 
NSString *title=fileName; 
NSString *docname=fileName; 
NSString *size=[NSString stringWithFormat:@"%d",[data length]]; 

/* 
NSString *post = [NSString stringWithFormat:@"userid=%@&title=%@&docname=%@&size=%@&content=%@",userid,title,docname,size,content]; 
NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding]; 
[self.request setHTTPMethod:@"POST"]; 

//NSString *POSTBoundary = [NSString stringWithFormat:@"0xKhTmLbOuNdArY"]; 
//[self.request addValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@\r\n", POSTBoundary] forHTTPHeaderField:@"Content-Type"]; 

[self.request setValue:[NSString stringWithFormat:@"%d", postData.length] forHTTPHeaderField:@"Content-Length"]; 
[self.request setValue:@"application/x-www-form-urlencoded charset=utf-8" forHTTPHeaderField:@"Content-Type"]; 
[self.request setHTTPBody:postData]; 
[NSURLConnection connectionWithRequest:self.request delegate:self]; 
*/ 

///// 
NSMutableURLRequest *request11 = [[NSMutableURLRequest alloc] init] ; 
[request11 setURL:url]; 
[request11 setHTTPMethod:@"POST"]; 
NSString *boundary = @"---------------------------14737809831466499882746641449"; 
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary]; 
[request11 addValue:contentType forHTTPHeaderField: @"Content-Type"]; 

NSMutableData *body = [NSMutableData data]; 
// Pdf File 
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[@"Content-Disposition: form-data; name=\"content\"; filename=\"INSPECTION.pdf\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
//[body appendData:[@"Content-Disposition: form-data; name=\"content\"\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[NSData dataWithData:data]]; 
[body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
//[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 

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

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

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

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

[request11 setHTTPBody:body]; 
[NSURLConnection connectionWithRequest:request11 delegate:self]; 
//[NSURLConnection sendSynchronousRequest:request11 returningResponse:nil error:nil]; 

///// 
} 

ответ

1

Я использовал следующую функцию для загрузки изображений, аудио и видео с небольшими изменениями. В этой функции urloptions есть строка запроса, которую вы хотите отправить с файлом, например userId and fileName.

Не получил возможность загрузить PDF, но надеюсь, что это вам поможет.

-(NSString *)uploadFile:(NSString *)urloptions: (NSString *) ext :(NSData *)imageData{ 

NSURL *url=[NSURL URLWithString:[NSString stringWithFormat:@"%@&%@",APP_URL,urloptions]]; 
NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; 
[request setURL:url]; 
[request setHTTPMethod:@"POST"]; 

NSString *boundary = [NSString stringWithString:@"---------------------------14737809831466499882746641449"]; 
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 stringWithFormat:@"Content-Disposition: form-data; name=\"formFile\"; filename=\".%@\"\r\n",ext] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\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]; 

//NSLog(@"%@",returnString); 
return returnString ; 

//[returnString release]; 

} 
0

Чтобы загрузить любой тип файла, который вы можете использовать библиотеку ASIHttpRequest, что вы можете получить от https://github.com/pokeb/asi-http-request.

Для загрузки Использовать файл ASIFormDataRequest класса этой библиотеки, что делает вашу работу легкой.

0

первый конвертировать PDF в двоичном

NSData theData = [NSData dataWithData:[GTMBase64 decodeString:theBinary]]; //first transfer it to NSData. 

[m_oTestingWeb loadData:theData 
      MIMEType:@"application/pdf" 
    textEncodingName:@"UTF-8" 
      baseURL:nil];     //using the web view to show it back 

затем загрузить эти данные на сервер. Вам необходимо создать API-интерфейс на веб-сервере, с которым iPhone может связаться, чтобы получить данные POST на ваш веб-сервер. Вы можете просто создать NSURLConnection, чтобы создать свой пакет для публикации данных из приложения iPhone.

Внутри NSURLConnection вы можете сказать, что это POST-пакет, а затем добавить данные в тело запроса. Ваши данные изображения должны быть преобразованы в UTF8 и сохранены как nvarchar или что-то в этих строках в вашей базе данных.

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

1

В то время как вы можете найти способ правильно разместить свои данные, будет проще и удобнее использовать обертку вокруг NSURLConnection, такую ​​как STHTTPRequest https://github.com/nst/STHTTPRequest. Вот то, что ваш код будет выглядеть следующим образом:

STHTTPRequest *r = [STHTTPRequest requestWithURLString:@"http://abcgroup.delivery-projects.com:81/api/index.php?keyword=docinsert"]; 

[r setFileToUpload:@"Inspection.pdf" parameterName:@"myFile"]; 

[r setPOSTDictionary:@{@"userid":@"", @"title":@"", @"docName":@""}]; // your parameters here 

r.completionBlock = ^(NSDictionary *headers, NSString *body) { 
    // ... 
}; 

r.errorBlock = ^(NSError *error) { 
    // ... 
}; 

[r startAsynchronous]; 
+1

Осмотрев библиотеку STHTTPRequest, я предпочел бы ее над «другим» для определенных потенциальных проблем с обработкой сообщений multipart/form-data. Итак, +1 – CouchDeveloper

0

Вы можете использовать последнюю версию библиотеки по AFNewtork: С AFNetworking вы можете сделать это:

NSURL *url = [NSURL URLWithString:@"my_base_url"]; 
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url]; 
NSData *imageData = UIImageJPEGRepresentation([UIImage imageNamed:@"yourfile.pdf"], 0.5); 
NSMutableURLRequest *request = [httpClient multipartFormRequestWithMethod:@"POST" path:@"/upload" parameters:nil constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) { 
    [formData appendPartWithFileData:imageData name:@"MainMedia" fileName:@"MainMedia" mimeType:@"image/jpeg"]; 
}]; 

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 
[operation setUploadProgressBlock:^(NSInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) { 
    NSLog(@"Sent %lld of %lld bytes", totalBytesWritten, totalBytesExpectedToWrite); 
}]; 

[operation start]; 

}

Скачать AFNetworking библиотеки и добавьте его в свой проект.

0

Две реальные проблемы, которые я могу пятно в «Пробовал 2»

  1. Кажется, ты забыл окончательный разделитель - см Ирфан ДАТСКИЙ пост.
  2. Вам нужен двоичный файл pdf - не UTF8.

Кроме того, не используйте синхронный запрос - используйте асинхронный стиль, реализующий методы делегата.

И вы должны установить заголовок Content-Length для части pdf.

Смежные вопросы