1

NSURLConnection을 사용하여 동일한 데이터 (NSString)를 서버에 보내고 이미지 또는 파일을 추가하여 콘텐트 유형의 값을 지정하고 싶습니다.NSURLConnection을 사용하여 파일 및 기타 매개 변수를 업로드하는 방법

인코딩

- (NSData *)encodingData:(NSMutableDictionary *)dictionary 
{ 
    NSMutableArray *arrayPosts = [[NSMutableArray alloc] init]; 
    [dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { 
     NSString *encodedKey = [key stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
     NSString *encodedValue = [obj stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
     [arrayPosts addObject:[NSString stringWithFormat:@"%@=%@",encodedKey,encodedValue]]; 
    }]; 
    NSString *encodedArrayPosts = [arrayPosts componentsJoinedByString:@"&"]; 
    return [encodedArrayPosts dataUsingEncoding:NSUTF8StringEncoding]; 
} 

이 데이터

- (void)startAsyncRequest 
{ 
    // Enable the network activity indicator in the status bar 
    [self enableActivityIndicatorInStatusBar]; 

    // Setting of the request 
    NSMutableURLRequest *urlRequest = [[NSMutableURLRequest alloc] initWithURL:self.url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:20.0]; 
    [urlRequest setHTTPMethod:self.method]; 
    [urlRequest setHTTPBody:[self encodingData:self.dictionaryPosts]]; 

    // Send the request 
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self]; 

    if (connection) { 
     // Connection succeded 
    self.receiveData = [NSMutableData data]; 
    } else { 
     // Connection Failed 
     self.error = @"Connection Failed"; 
     // Inform the user that the connection failed 
     [self.delegate requestFailed:self]; 
    } 
} 

답변

4

보내기 그런 다음 스트림 유형을 분석

public InsertImage(Stream stream) 

뭔가 그와 같은 서버에 같은 스트림 형태로 데이터를 전달해야합니다. 이것은 당신은 당신의 서버 측에서 스트림 타입의 데이터를 얻을하고 분석 할 몇 가지 경계

- (NSURLRequest *)buildRequest:(NSData *)paramData fileName:(NSString *)name { 
    NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; 
    NSString *charset = (NSString *)CFStringConvertEncodingToIANACharSetName(CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding)); 
    [request setURL:self.url]; 
    [request setHTTPMethod:self.method]; 

    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]]; 

    // Sample Key Value for data 
    [tempPostData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", @"Key_Param"] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [tempPostData appendData:@"Value_Param"] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [tempPostData appendData:[endBoundary dataUsingEncoding:NSUTF8StringEncoding]]; 

    // Sample file to send as data 
    [tempPostData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\"; filename=\"%@\"\r\n", name] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [tempPostData appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [tempPostData appendData:paramData]; 
    [tempPostData appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [request setHTTPBody:tempPostData]; 
    return request; 
} 

를 사용하여 요청을 구축하는 방법입니다

, 당신은 예를 들어, 패스 키에 값 기반을 얻을 수 있습니다 Key_Param 및 전송하는 파일의 이름 (fileName)이 포함됩니다.

+0

하지만 어떻게 파일과 간단한 데이터를 둘 다 혼합 할 수 있습니까? –

+0

위의 @ Tamim.Z 코드 ** 데이터의 샘플 키 값 **은 단순 데이터 용이고 다른 하나는 파일입니다. – dianz