2013-03-14 20 views
22

W mojej aplikacji na iOS chcę przesłać plik z interfejsem API Java za pomocą NSMutableURLRequest dla pliku wieloczęściowego. tutaj jest formularz, który pokazuje parametr.iPhone przesłać wieloczęściowy plik za pomocą AFNetworking

<form action="API_URL" encType='multipart/form-data' method=post> 
      <input type=file name="files"> 
      <input type=submit value="Upload Attempt Files"> 

EDIT Form2

 <form action='URL' method="post" encType='multipart/form-data'> 
<input name="key1" value='123'> 
<input name="key2" value='asdf'> 
<input name="key3" value='qwerty'> 
<input name="key4" value='aaa'> 
<input name="key5" value='aaa'> 
<input name="key6" value='false'> 
<input type="file" name="files"> 
<input type=submit value="Create Forum Posts"> 
    </form>   

Jak mogę to osiągnąć.

tutaj ten Question pokazuje, jak przesłać wieloczęściowy plik przy użyciu AFNetworking w systemie iOS (cel c). Ale nie mam pojęcia, jak ustawić parametr zgodnie z formularzem, którego używam.

Proszę o pomoc i sugerują

+1

Czy prawidłowo zakładać chcesz zrobić ten upload przez AFNetworking w Objective-C? (Odwołanie do "Java API" jest mylące, ale teraz zakładam, że po prostu mówisz, że uruchamiasz trochę Java na serwerze.) Czy to prawda?) – Rob

+0

ya z obiektywu c Dzwonię do API napisanego w Javie na serwerze – ios

+0

Ok . Aplikacja na iOS nie dba o to, jakiej technologii serwer używa za kulisami, ponieważ komunikuje się za pośrednictwem protokołu HTTP i to wszystko, co naprawdę nas interesuje. Tag "java" i odnośniki w twoim pytaniu mogą wysłać czytelnikom złą ścieżkę. Możesz usunąć te odniesienia ... – Rob

Odpowiedz

77

Patrząc na HTML The name twoich <input type=file> jest files, a zatem należałoby użyć @"files" jako parametr do metody appendPartWithFileDataname. Na przykład, z AFNetworking 3.x:

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; 

[manager POST:urlString parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { 
    [formData appendPartWithFileData:imageData 
           name:@"files" 
          fileName:photoName mimeType:@"image/jpeg"]; 

    [formData appendPartWithFormData:[key1 dataUsingEncoding:NSUTF8StringEncoding] 
           name:@"key1"]; 

    [formData appendPartWithFormData:[key2 dataUsingEncoding:NSUTF8StringEncoding] 
           name:@"key2"]; 

    // etc. 
} progress:nil success:^(NSURLSessionDataTask *task, id responseObject) { 
    NSLog(@"Response: %@", responseObject); 
} failure:^(NSURLSessionDataTask *task, NSError *error) { 
    NSLog(@"Error: %@", error); 
}]; 

(dla AFNetworking 1.x oraz 2.x składni, zobacz historię zmian tej odpowiedzi.)

+0

Dzięki za pomoc .... tutaj, jak wysłać dane cookie do uwierzytelniania. Jeszcze jedna rzecz, o jaką kiedykolwiek prosiłem, wysyłam to nie jest widoczne na serwerze, co może być nie tak ... – ios

+0

@ios Nie jestem pewien, czy ciasteczka, ale może [ta odpowiedź] (http://stackoverflow.com/questions/10984374/how-to-manage-sessions-with-afnetworking) pomaga. Dlaczego nie działa, nie mogę powiedzieć, ponieważ przetestowałem go na moim serwerze, a plik pokazał się dobrze. Ale jeśli potrzebujesz plików cookie do uwierzytelnienia i tego nie zrobiłeś, czy spodziewałbyś się, że to zadziała? Niezależnie od tego, ewentualnie edytuj swoje pytanie, dodając najnowsze wydanie kodu do przesłania. – Rob

+0

tutaj mam też inną formę: formularz 2 jak pokazano w pytaniu. Jak z tym pracować? Proszę o pomoc – ios

3
-(void) makePhotoUploadRequest{ 

    NSArray *keys = [[NSArray alloc]initWithObjects:@"UserID", @"CompanyName" ,@"Location",@"Latitude",@"Longitude",@"Tagline",@"Goals",@"ColorName",nil]; 
    NSArray *values =[[NSArray alloc]initWithObjects:@"103",@"queppelin",@"Jaiur",@"11.3" ,@"12.3",@"Let's do it",@"Let's do it",@"Let's do it", nil]; 
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 

    NSURL *baseUrl = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@/%@/RegisterCompanyUser",serverRequest,serverPort,serverName]]; 

    NSString *charset = (NSString *)CFStringConvertEncodingToIANACharSetName(CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding)); 
    [request setURL:baseUrl]; 
    [request setHTTPMethod:@"POST"]; 

    NSString *boundary = @"0xKhTmLbOuNdArY"; 
    NSString *endBoundary = [NSString stringWithFormat:@"\r\n--%@\r\n", boundary]; 

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

    NSMutableData *tempPostData = [NSMutableData data]; 
    [tempPostData appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 


      for(int i=0;i<keys.count;i++){ 
       NSString *str = values[i]; 
       NSString *key =keys[i]; 
       NSLog(@"Key Value pair: %@-%@",key,str); 
       [tempPostData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", key] dataUsingEncoding:NSUTF8StringEncoding]]; 
       [tempPostData appendData:[str dataUsingEncoding:NSUTF8StringEncoding]]; 
       // [tempPostData appendData:[@"\r\n--%@\r\n",boundary dataUsingEncoding:NSUTF8StringEncoding]]; 
        [tempPostData appendData:[endBoundary dataUsingEncoding:NSUTF8StringEncoding]]; 

     } 





    // Sample file to send as data 
    [tempPostData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"Image\"; filename=\"%@\"\r\n", @"company-logo.png"] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [tempPostData appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 

    UIImage *myImageObj = [UIImage imageNamed:@"company-logo.png"]; 
    NSData *mydata= UIImagePNGRepresentation(myImageObj); 
    NSLog(@"Image data:%d",mydata.length); 
     [tempPostData appendData:mydata]; 

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

    NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
    if(theConnection) 
    { 
     dataWebService = [NSMutableData data] ; 
     NSLog(@"request uploading successful"); 
    } 
    else 
    { 
     NSLog(@"theConnection is NULL"); 
    } 


} 
Powiązane problemy