diff --git a/AFNetworking/AFHTTPClient.h b/AFNetworking/AFHTTPClient.h index e740a4a..4039564 100644 --- a/AFNetworking/AFHTTPClient.h +++ b/AFNetworking/AFHTTPClient.h @@ -37,7 +37,7 @@ } /** - The url used as the base for paths specified in methods such as `getPath:parameters:success:failure` + The url used as the base for paths specified in methods such as `getPath:parameteres:success:failure` */ @property (readonly, nonatomic, retain) NSURL *baseURL; @@ -49,7 +49,7 @@ /** The operation queue which manages operations enqueued by the HTTP client. */ -@property (readonly, nonatomic, retain) NSOperationQueue *operationQueue; +@property (readonly, nonatomic, retain) NSOperationQueue *operationQueue;; ///--------------------------------------------- /// @name Creating and Initializing HTTP Clients @@ -267,6 +267,8 @@ */ - (void)appendPartWithFile:(NSURL *)fileURL mimeType:(NSString *)mimeType fileName:(NSString *)fileName; +- (void)appendPartWithFileData:(NSData *)data mimeType:(NSString *)mimeType name:(NSString *)name; + /** Appends encoded data to the form data. diff --git a/AFNetworking/AFHTTPClient.m b/AFNetworking/AFHTTPClient.m index 6636943..10bed77 100644 --- a/AFNetworking/AFHTTPClient.m +++ b/AFNetworking/AFHTTPClient.m @@ -27,11 +27,11 @@ static NSString * const kAFMultipartFormLineDelimiter = @"\r\n"; // CRLF static NSString * const kAFMultipartFormBoundary = @"Boundary+0xAbCdEfGbOuNdArY"; static NSString * AFMultipartFormEncapsulationBoundary() { - return [NSString stringWithFormat:@"--%@", kAFMultipartFormBoundary]; + return [NSString stringWithFormat:@"%@--%@%@", kAFMultipartFormLineDelimiter, kAFMultipartFormBoundary, kAFMultipartFormLineDelimiter]; } static NSString * AFMultipartFormFinalBoundary() { - return [NSString stringWithFormat:@"--%@--", kAFMultipartFormBoundary]; + return [NSString stringWithFormat:@"%@--%@--", kAFMultipartFormLineDelimiter, kAFMultipartFormBoundary]; } @interface AFMultipartFormDataProxy : NSObject { @@ -305,21 +305,17 @@ static NSString * AFURLEncodedStringFromStringWithEncoding(NSString *string, NSS - (NSData *)data { NSMutableData *finalizedData = [NSMutableData dataWithData:self.mutableData]; [finalizedData appendData:[AFMultipartFormFinalBoundary() dataUsingEncoding:self.stringEncoding]]; - return finalizedData; } #pragma mark - AFMultipartFormDataProxy - (void)appendPartWithHeaders:(NSDictionary *)headers body:(NSData *)body { - if ([self.mutableData length] > 0) { - [self appendString:AFMultipartFormEncapsulationBoundary()]; - [self appendBlankLine]; - } + + [self appendString:AFMultipartFormEncapsulationBoundary()]; for (NSString *field in [headers allKeys]) { - [self appendString:[NSString stringWithFormat:@"%@: %@", field, [headers valueForKey:field]]]; - [self appendBlankLine]; + [self appendString:[NSString stringWithFormat:@"%@: %@%@", field, [headers valueForKey:field], kAFMultipartFormLineDelimiter]]; } [self appendBlankLine]; @@ -351,6 +347,17 @@ static NSString * AFURLEncodedStringFromStringWithEncoding(NSString *string, NSS [self appendPartWithHeaders:mutableHeaders body:data]; } +- (void)appendPartWithFileData:(NSData *)data mimeType:(NSString *)mimeType name:(NSString *)name { + + NSString *fileName = [[NSString stringWithFormat:@"%d", [[NSDate date] hash]] stringByAppendingPathExtension:[mimeType lastPathComponent]]; + + NSMutableDictionary *mutableHeaders = [NSMutableDictionary dictionary]; + [mutableHeaders setValue:[NSString stringWithFormat:@"file; name=\"%@\"; filename=\"%@\"", name, fileName] forKey:@"Content-Disposition"]; + [mutableHeaders setValue:mimeType forKey:@"Content-Type"]; + + [self appendPartWithHeaders:mutableHeaders body:data]; +} + - (void)appendData:(NSData *)data { [self.mutableData appendData:data]; }